ASP.NET sessionState SQLServer模式超时不起作用

时间:2011-12-17 17:48:02

标签: asp.net

我已将sessionState配置为使用下面的自定义SQL服务器,并将其设置为在1分钟后过期。似乎会话始终保留在浏览器和SQL Server上。我甚至将regenerateExpiredSessionId设置为false并且仍然存在相同的问题。我在IIS 7 windows 7 pro下运行asp.net 4.0。

我的web.config配置

<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="Data Source=MYCON\SQL2008REXPRESS;Initial Catalog=DBASPState; User ID=DB1543Write;Password=test" timeout="1" sqlCommandTimeout="10" regenerateExpiredSessionId="false" stateNetworkTimeout="10" compressionEnabled="true" cookieless="false" />

我在sessionstate数据库中检查了表ASPStateTempSessions并查看了其中的记录。读写,所有者权限是当前使用此数据库的urrent用户配置的。 “Even Viewer”没有错误。

我已经检查了ASPStateTempSessions表中的值,并且在下面看起来似乎会话关闭比较5分钟比较1分钟。似乎asp.net使用另一个时区而不是当前的机器时区将其配置为在1分钟内过期。

我当前的时间是12/17/2011 11:29 AM 数据库列的值为CreatedDate(column)2011-12-17 17:29:01.677 到期(专栏)2011-12-17 17:30:03.903

数据库值的完整详情如下。

第一张唱片是我第一次访问我的网站时

SessionId, Created, Expires, LockDate, LockDateLocal, LockCookie, Timeout, Locked, SessionItemShort, SessionItemLong, Flags
0wtp4j0traj5e0gydygkyoe22476b033    2011-12-17 17:29:01.677 2011-12-17 17:30:03.903 2011-12-17 17:29:03.873 2011-12-17 11:29:03.873 11  1   False   <Binary data>   NULL    0

在我按下浏览器上的“刷新”按钮后,记录已更新为新的过期时间,但会话信息仍在那里

0wtp4j0traj5e0gydygkyoe22476b033    2011-12-17 17:29:01.677 2011-12-17 17:37:08.910 2011-12-17 17:36:08.907 2011-12-17 11:36:08.907 13  1   False   <Binary data>   NULL    0

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

到期时间为UTC。

当SQL会话过期时,它们不会立即从会话表中删除,也不会收到Session_End事件。

SQL会话提供程序不会主动监视会话表中的Expires列。相反,会话在从表中删除之前不会“正式”过期,这是通过调用DeleteExpiredSessions存储过程的SQL代理作业完成的。默认情况下,作业配置为每60秒运行一次。当然,这意味着SQL Agent需要在会话到期时运行才能工作。这也意味着您需要在“实际”到期之前“名义”到期后至少等待60秒。

如果需要,您可以通过自己调用SP来强制过期。