0

我在设置会话超时的 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);

一旦超时,这会导致页面自行刷新。我的页面使用它成功地刷新了自己。但是,我还有一些其他代码在会话过期时会被命中,但它永远不会被命中,因为它表明会话从未过期。

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

4

1 回答 1

2

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

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

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

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

于 2012-04-13T16:32:06.860 回答