为什么Session.Timeout不会使会话到期?

时间:2012-04-13 16:25:53

标签: c# asp.net session timeout

我在我的Asp.net应用程序中遇到了一个问题,我正在设置会话超时,并且在一段时间过后,会话仍然没有过期。这个应用程序有一个SQL Server 2008后端数据库,在那里我存储了这个应用程序的会话超时值。我目前将其设置为3分钟用于测试目的。在Global.asax中,在Session_Start中我有以下内容:

// Set the timeout
int timeout = GetSessionLength();
this.Session.Timeout = timeout;

GetSessionLength()是一个函数,在查询数据库的会话超时后返回一个整数值。

然后,在网站的母版页上,在Page_Load上,我有以下内容:

System.Web.UI.HtmlControls.HtmlMeta hmRefresh = new System.Web.UI.HtmlControls.HtmlMeta();
hmRefresh.HttpEquiv = "Refresh";
hmRefresh.Content = (this.Session.Timeout * 60).ToString();
Page.Header.Controls.Add(hmRefresh);

这会导致页面在达到超时后自行刷新。我的页面使用此功能成功刷新了自己。但是,我有一些其他代码在会话过期时被点击,但是它永远不会被点击,因为它表明会话永远不会过期。

此外,我一直在我的计算机上开发一个不同的应用程序,并且我在该应用程序中使用相同的代码来检测会话超时,并且它对该应用程序非常有效。所以我不确定为什么不适合这个。

1 个答案:

答案 0 :(得分:2)

我猜你在元刷新之间的同一个会话中有其他一些请求。同一会话中的任何请求都将过期。此外,您尝试在会话到期时立即刷新,因此很有可能在元刷新时随机过期/不过期。

调试使用http调试器(如Fiddler)并验证发送的请求。

注意:对于SQL会话状态,没有关于过期的通知(与内存中的状态不同),因此了解SQL / State服务案例中会话状态是否过期的唯一方法是查看Session对象是否为空。如果您使用的是Session_End,请查看Session-State Events

  

仅当会话状态Mode属性设置为InProc时才支持Session_OnEnd事件,这是默认值。