重置会话超时而不在 ASP.Net 中进行回发

Posted

技术标签:

【中文标题】重置会话超时而不在 ASP.Net 中进行回发【英文标题】:Reset session timeout without doing postback in ASP.Net 【发布时间】:2012-12-09 11:37:56 【问题描述】:

有没有办法在不回发的情况下重置会话超时?

在这种情况下,我不只是想对用户隐藏回发,我需要在没有回发的情况下重置超时。

在我的页面上,我需要弹出一个对话框并通知用户他的会话正在超时,如果他想保持它处于活动状态,他需要单击一个按钮。现在,当他单击该按钮时,我不想回发该页面,因为这会导致数据出现问题。 (不涉及问题)


根据答案,我已经修改了代码,但它仍然无法正常工作。 docs.google.com/open?id=0B-Pl5DH2W9MvMDV6SUNiTXR0Z2M

【问题讨论】:

您是否要延长会话?是基于一个动作吗? 是的,我刚刚更新了问题。 您可以使用 ajax 发布到启用会话的方法.. 您能否提供代码示例作为答案?请 【参考方案1】:

这里有很多有用的建议:How To Keep ASP.NET Session Alive。

【讨论】:

【参考方案2】:

要刷新会话,您需要调用某些内容 - 我建议使用仅显示空 gif 的简单处理程序。这是一个简单的代码:

public class JustEmptyGif : IHttpHandler ,IRequiresSessionState 

    // 1x1 transparent GIF
    private readonly byte[] GifData = 
        0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
        0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
        0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
        0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
        0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
        0x02, 0x44, 0x01, 0x00, 0x3b
    ;  

    public void ProcessRequest (HttpContext context) 
    
        context.Response.ContentType = "image/gif";
        context.Response.Buffer = false;
        context.Response.OutputStream.Write(GifData, 0, GifData.Length);        
    

    public bool IsReusable 
    
        get 
            return false;
        
    

这段代码只是一个处理程序,比如说EmptyImage.ashx,请注意我已经包含了IRequiresSessionState,它可以调用和更新会话。

现在你唯一需要做的就是用一些脚本更新隐藏的图像,如:

<img id="keepAliveIMG"    src="EmptyImage.ashx?" /> 
<script>
var myImg = document.getElementById("keepAliveIMG");
    myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
</script>

我已将随机数放在末尾以避免将其保留在缓存中并强制它重新加载它。这里没有回发,只是加载了一个小图像。

【讨论】:

我收到以下错误:Microsoft JScript 运行时错误:'myImg' is null or not an object 我需要添加一个文件并将其命名为“EmptyImage.ashx?” ? 使用系统;使用 System.Web;公共类 JustEmptyGif : IHttpHandler, System.Web.SessionState.IRequiresSessionState ... 它说错误 1 ​​无法创建类型“处理程序”。 @Sev 很简单——在Visual Studio上,右键你的项目,添加新项目,选择Generic Handler。【参考方案3】:

我能想到的唯一方法是像这样对虚拟 .net 页面进行 ajax 调用:

function keepAlive()

var xmlHttp = null;

xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", "KeepAlive.aspx", false );
xmlHttp.send( null );

然后这样称呼它

<input type=button onClick='keepAlive();' >

【讨论】:

这取决于你想触发什么 您可以创建一个使用会话对象的页面(对它的每个 http GET 都会刷新会话超时值)。然后在您的客户端代码中(例如,如果您有 jQuery),您可以执行 $.get('/that/dummy/page.aspx') 并告诉服务器您仍然对保持会话活动感兴趣. 我尝试了keepalive示例,但它没有重置计时器 @sev,它击中了 keepalive.aspx 吗?你走过了吗?

以上是关于重置会话超时而不在 ASP.Net 中进行回发的主要内容,如果未能解决你的问题,请参考以下文章

在没有回发的情况下重置 ASP.NET 中的页面

ASP.NET 中的会话超时

从 IIS 获取我托管的 Asp.Net 网站的运行会话计数

在 Ajax 调用期间保持 ASP.Net 会话处于活动状态

IIS 会话超时与 ASP.NET 会话超时

ASP.NET 在 asp:ImageButton 上没有回发