我有一句话:
<sessionState mode="SQLServer" sqlConnectionString="Data Source=localhost;User Id=sa;Password=test;" timeout="1" />
将会话存储在sql状态服务器中。但是一分钟后它没有正常超时。
当我更改线以使用InProc模式时:
<sessionState mode="InProc" sqlConnectionString="Data Source=localhost;User Id=sa;Password=test;" timeout="1" />
一分钟后会超时。
为什么会发生这种情况?使用SqlServer时如何才能使其超时?
答案 0 :(得分:6)
如果您使用的是SQL Server Express,那是因为没有SQL Server代理来执行DeleteExpiredSessions过程。
以下是该问题的可能解决方法:
在更新会话的存储过程中,我添加了SQL 从DeleteExpiredSessions过程到存储的更新会话 程序(我不记得名字)所以检查旧会话, 删除旧会话,然后更新当前会话。该 无论如何,每次点击都会运行更新会话的存储过程, 所以我在会话之前添加了两行删除旧会话的行 已更新。这似乎工作正常。
答案 1 :(得分:6)
确保SQL Server代理服务正在运行
右键单击名为ASPState_Job_DeleteExpiredSessions
的SQL Server代理作业,然后单击“查看历史记录” - 确保此作业每1分钟成功运行一次。
在我的情况下,不知何故(可能在涉及命名实例的多个安装之一),我的SQL Server代理将其属性Connection -> Alias Localhost Server
设置为服务器名称而不是servername \ instancename。
当发生此更改时,ASPState_Job_DeleteExpiredSessions
似乎无限期运行且无法停止。因此,我尝试重新启动SQL Server代理服务,但它不会重新启动。但是,一旦我将Connection -> Alias Localhost Server
属性更改为servername \ instancename,SQL Server代理就会立即启动并且ASPState_Job_DeleteExpiredSessions
作业开始成功运行一次,就像它应该......这显然已经解决了我的超时问题。
答案 2 :(得分:1)
您可以通过设置表单身份验证cookie的超时来控制会话的超时:
FormsAuthenticationTicket authTicket =
new FormsAuthenticationTicket(1, // version
txtUserName.Text,
DateTime.Now,
DateTime.Now.AddMinutes(1),
false,@"\");
这样,用户在1分钟后就失去了与会话的联系。