设置为Sql Server时,为什么会话超时不起作用?

时间:2011-08-19 13:21:36

标签: asp.net iis session-timeout

我有一句话:

<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时如何才能使其超时?

3 个答案:

答案 0 :(得分:6)

如果您使用的是SQL Server Express,那是因为没有SQL Server代理来执行DeleteExpiredSessions过程。

以下是该问题的可能解决方法:

  

在更新会话的存储过程中,我添加了SQL   从DeleteExpiredSessions过程到存储的更新会话   程序(我不记得名字)所以检查旧会话,   删除旧会话,然后更新当前会话。该   无论如何,每次点击都会运行更新会话的存储过程,   所以我在会话之前添加了两行删除旧会话的行   已更新。这似乎工作正常。

答案 1 :(得分:6)

  1. 确保SQL Server代理服务正在运行

  2. 右键单击名为ASPState_Job_DeleteExpiredSessions的SQL Server代理作业,然后单击“查看历史记录” - 确保此作业每1分钟成功运行一次。

  3. 在我的情况下,不知何故(可能在涉及命名实例的多个安装之一),我的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分钟后就失去了与会话的联系。