2012-04-13 107 views
0

我在我的Asp.net应用程序中,我设置会话超时,并经过一段时间后,该会议仍未过期的问题。这个应用程序有一个SQL Server 2008后端数据库,并且在那里存储此应用程序的会话超时值。我目前将其设置为3分钟用于测试目的。在Global.asax中,在在session_start我有以下几点:ASP.Net会话超时不工作

 // 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

根据服务器的情况,如果您等待了几秒钟,为了确保时间已过,该怎么办?远射... – 2012-04-13 16:28:47

+1

出于好奇,你知道ASP.NET可以通过使用web.config文件为你管理所有这些,对吧? – 2012-04-13 16:30:18

+0

@ ajax81,是的,我非常清楚这一点。为了安全起见,我想远程地从SQL Server中进行更改。如果我们选择的会话长度太短,我可以轻松地更改它。 – 2012-04-13 16:35:10

回答

1

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

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

注:与SQL会话状态没有关于到期通知(不像在内存中的一个),所以要知道,如果会话状态在SQL /国家服务的情况下到期,唯一的办法就是看是否Session对象为空。如果您使用Session_End,请检查Session-State Events

仅当会话状态Mode属性设置为InProc(缺省值)时才支持Session_OnEnd事件。

+0

这个答案与@AndrewBarber评论一起组合。会话超时时发生了一些奇怪的行为。我将刷新时间增加了10秒,但仍然没有过期,所以我尝试了30秒,到那个时候它已经过期。中间没有任何请求会导致它过期。无论如何,增加更新时间解决了这个问题。 – 2012-04-15 22:51:25