为什么Asp.Net中的会话对象在超时后不被删除? 为什么在超时后不删除会话对象?

为什么Asp.Net中的会话对象在超时后不被删除? 为什么在超时后不删除会话对象?,asp.net,session,session-state,asp.net-4.0,Asp.net,Session,Session State,Asp.net 4.0,我使用的是Asp.NET4.0,会话状态配置如下所示 <sessionState mode="SQLServer" cookieless="false" timeout="5" allowCustomSqlDatabase="true" sqlConnectionString="data source=.\SqlExpress;

我使用的是Asp.NET4.0,会话状态配置如下所示

<sessionState mode="SQLServer" cookieless="false" timeout="5"
                  allowCustomSqlDatabase="true" 
                  sqlConnectionString="data source=.\SqlExpress;initial catalog=App_SessionState;user id=sa;password=xxxxxxxx"/>
mObj在10分钟后不会为空。

会话“永远不会为空,但在超时过期后,会话对象将被清空(或重新实例化),另一个会话将自动启动(您可以通过处理SessionEnd和SessionStart事件来检查这一点),并且您将始终拥有对会话对象的引用。
不会发生吗?仍然可以看到上一个会话的数据吗?

安装了一个名为
DeleteExpiredSessions
的存储过程,从作业
ASPState\u job\u DeleteExpiredSessions
调用,并且每分钟执行一次(如果我正确读取了InstallSqlState.sql文件)

该过程基本上从过期的ASPStateTempSessions调用
DELETE

因此,如果没有删除对象,请检查Expires列,并验证您正在与utc日期进行比较。如果有疑问,请从过期的ASPStateTempSessions执行
选择*。另外,请确保您的
ASPState\u Job\u DeleteExpiresSessions
已启用并正常工作


一个快速的(完全未经证实的想法);SQL Server Express是否随SQL代理一起提供?是否启用并能够执行计划作业?

补充Simon所说的,如果没有运行SQL Server代理,则不会清除会话值,除非实际执行数据库中的存储过程。
我认为SQLServerExpress没有代理,因此不可能实现自动化作业

如果您可以控制服务器,那么我建议您通过windows设置一个计划任务,执行存储过程或清除过期会话的作业。我现在不知道存储过程的确切名称,但它的名称应该非常明确

因此,您可以选择升级到具有可用SQL server代理的SQL server版本,或者设置一些设置来手动执行存储过程以清除过期的会话


以头韵形式,您可以使用InProc会话,该会话将自动清除。但是我假设,由于InProc是默认值,因此您切换到SQL Server是有原因的。

您的意思是在数据库中看到变量,而不是在内存中?我不知道在sqlserver中管理会话需要什么机制,但重要的是asp.net中可见的会话对象。验证SessionStart和SessionEnd事件是否正确发生作为一个快速测试,查看25分钟后是否得到预期结果(默认超时为20分钟)。把结果贴在这里。您没有使用forms身份验证或任何其他可能强制其自身超时的机制?@Paul:那里没有身份验证。SQL server会话模式不会触发这些事件
  var myObj = Session["MyKey"] as MyClass;