C# 在asp.net中处理会话超时的最佳方法是什么

C# 在asp.net中处理会话超时的最佳方法是什么,c#,asp.net,session-timeout,C#,Asp.net,Session Timeout,处理会话超时有多种方法,如加载函数上的“元刷新”javascript等 我想整洁的东西,如:5分钟前超时,警告用户 我也在考虑在浏览器打开的时候保持会话的打开状态(仍然需要弄清楚怎么做…可能是一些带有刷新功能的iframe) 您如何处理会话超时,以及您认为我应该朝哪个方向去?我唯一能想到的是在页面上生成一些脚本来创建客户端计时器,以便在接收和呈现页面时,它可以在X分钟后(即过期前5分钟)显示警报 如果您希望会话本身保持活动状态,那么可以使用通过AJAX定期调用的通用处理程序(ASHX)来实现这一

处理会话超时有多种方法,如加载函数上的“元刷新”javascript等

我想整洁的东西,如:5分钟前超时,警告用户

我也在考虑在浏览器打开的时候保持会话的打开状态(仍然需要弄清楚怎么做…可能是一些带有刷新功能的iframe)


您如何处理会话超时,以及您认为我应该朝哪个方向去?

我唯一能想到的是在页面上生成一些脚本来创建客户端计时器,以便在接收和呈现页面时,它可以在X分钟后(即过期前5分钟)显示警报

如果您希望会话本身保持活动状态,那么可以使用通过AJAX定期调用的通用处理程序(ASHX)来实现这一点。这将有助于刷新会话,并且只要AJAX调用继续,会话就应该保持活动状态

示例“keepalive.ASHX”:


使用制度;
公共类keepalive:System.Web.IHttpHandler
{       
public void ProcessRequest(System.Web.HttpContext上下文)
{
context.Response.ContentType=“text/json”;
var thisUser=System.Web.Security.Membership.GetUser();
if(thisUser!=null)
context.Response.Write(“[{\“User\”:\”+thisUser.UserName+“\”}]”);
}
公共布尔可重用
{
获取{return false;}
}
}
下面是页面上调用它的脚本(为了简单起见使用jQuery):


函数keepAliveInterval()
{
$.ajax(
{
url:“keepalive.ashx”,
上下文:document.body,
错误:函数(){
警报(“AJAX keepalive.ashx错误:(”);
}
});
}
$(文档).ready(函数(){
setInterval('keepAliveInterval()',60000);
});

处理会话超时的最佳方法

我说有两种基本情况。
一种是当用户输入很少或没有数据时,只是阅读报告,或者用鼠标进行small思考。在这种情况下,很难通知他会话即将过期。如果您要检查调用代码的会话剩余时间,则自动更新会话。如果您有ti如果要倒计时会话,那么用户可能已经打开了web的一个新选项卡,会话将过期,但不是您使用javascript记录的时间,用户收到错误消息

所以对我来说,当用户输入很少或没有数据时,就让会话过期,如果他失去了一次点击,它会在以后再次进行

第二种情况是,当用户需要输入许多数据时,可能需要一些时间,例如,编写和修复长文本。在这种情况下,我使用以下技术,不会让会话中断

如何在浏览器打开时保持会话打开

这是一个非常好且简单的技术,我使用一个图像,在会话超时之前使用JavaScript重新加载它

<img id="keepAliveIMG" width="1" height="1" src="/img/ui/spacer.gif?" /> 

<script language="javascript" type="text/javascript"> 
    var myImg = document.getElementById("keepAliveIMG");

    if (myImg){
        window.setInterval(function(){
              myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
            }, 6000);
    }   
</script> 
这是在重定向到登录页面之前调用的函数,在那里您可以看到是否有post数据和登录所需的使用,您可以保存post数据,将其发送到新的重定向页面,将其发送到服务器(可能在会话中,也可能在临时数据库中)

现在,在用户再次登录后,您再次将其重定向到最后一页,并保存post数据,用户将继续原样


这里唯一的技巧是制作一个中间页面,用最后发布的数据和自动重定向javascript调用呈现表单。

使用一些jquery,在web.config中关闭会话超时变量。您可以使用jquery延迟技巧,在特定时间发生时(加载页面后的x分钟数),它会弹出一个div,以x分钟表示会话超时。很好,干净,非常简单


关于会话超时,Codesleuth的ajax调用将是完美的。

我喜欢这种方法,但您必须确保未设置映像上的缓存,并且文件夹安全性不只是在配置中设置为匿名。一个缺点是,如果会话确实过期,除非设置
OneError
事件。@Codesleuth如果你看得更清楚,你会发现我在图像的末尾做了一个随机数-因此不会被缓存。-这段代码在其他4种方式中经过测试,现在仍然有效,并且正在工作:)是的,这似乎是一种保持会话打开的好方法。哇,比我最初想到的iframes要好。啊,的确如此:)干得好。就我个人而言,我认为我会坚持使用我自己的keepalive ajax调用,因为从您调用keepalive.ashx的那一刻起,我也可以返回状态更新信息(系统警报:D),即用户的会话被更新。。(或者不是?)我不是100%确定处理程序是如何工作的,但是这如何保持会话的开放性呢?每5分钟创建一个Web服务并通过javascript调用一个函数是否也会有同样的效果?如果是的话。。。缺点是什么?@Aristos:是的,但是如果它由于其他原因过期,错误警报将告诉用户(即他们是否在另一个选项卡/窗口中注销?)您的代码也是一个好主意,是的,它提供了更多有用的信息。
<script type='text/javascript'>
    function keepAliveInterval()
    {
        $.ajax(
        {
            url: "keepalive.ashx",
            context: document.body,
            error: function () {
                alert("AJAX keepalive.ashx error :(");
            }
        });
    }

    $(document).ready(function () {
        window.setInterval('keepAliveInterval()', 60000);
    });
</script>
<img id="keepAliveIMG" width="1" height="1" src="/img/ui/spacer.gif?" /> 

<script language="javascript" type="text/javascript"> 
    var myImg = document.getElementById("keepAliveIMG");

    if (myImg){
        window.setInterval(function(){
              myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
            }, 6000);
    }   
</script> 
protected void Application_AuthenticateRequest(Object sender, EventArgs e)