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

Exi*_*tos 5 asp.net iis session-timeout

我有这条线:

<sessionState mode="SQLServer" sqlConnectionString="Data Source=localhost;User Id=sa;Password=test;" timeout="1" />
Run Code Online (Sandbox Code Playgroud)

它将会话存储在sql状态服务器中.但是一分钟后它没有正常超时.

当我更改线以使用InProc模式时:

<sessionState mode="InProc" sqlConnectionString="Data Source=localhost;User Id=sa;Password=test;" timeout="1" />
Run Code Online (Sandbox Code Playgroud)

一分钟后它会超时.

任何想法为什么会这样?使用SqlServer时如何让它超时?

Jam*_*son 6

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

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

在更新会话的存储过程中,我已将DeleteExpiredSessions过程中的SQL添加到更新会话存储过程(我记不起名称),因此它会检查旧会话,删除旧会话,然后更新当前会话.无论如何,更新会话的存储过程都会在每次点击时运行,因此我在会话更新之前添加了两行删除旧会话的行.这似乎工作正常.


小智 6

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

  2. 右键单击名为的SQL Server代理作业ASPState_Job_DeleteExpiredSessions,然后单击"查看历史记录" - 确保此作业每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作业开始成功运行一次,就像它应该......这显然解决了我的超时问题.