我在我的开发盒上运行一个ASP.NET网站(Vista / IIS7上的.NET 2.0)。 global.asax.cs中的Session_Start方法记录对文件的每次调用(log4net)。 Session_End方法还记录每次调用。
我正在使用InProc会话状态,并将会话超时设置为5分钟(以避免等待20分钟)。
我点击网站,等待5分钟单位我看到Session_End记录。然后我F5网站。浏览器仍然具有会话cookie并将其发送到服务器。调用Session_Start并使用相同的会话ID创建新会话(顺便说一句:我需要将其作为相同的会话ID,因为它用于在数据库中存储数据)。
结果: 每次我在之前结束的会话中按F5时,都会调用Session_Start方法,执行请求并立即调用Session_End方法。
当我打开另一个浏览器时,只调用一次Session_Start方法。然后在5分钟后,Session_End每个F5导致Session_Start / request / Session_End序列执行。
web.config相关部分:
<system.web>
<compilation debug="true" />
<sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>
答案 0 :(得分:6)
regenerateExpiredSessionId
设置与cookieless URLs only有关,它不会影响将重复使用的会话Cookie的行为。
您遇到的问题是ASP.NET 2.0 / 3.5根据是否正在使用会话来处理会话的方式。在正常情况下,它不会尝试在第一次使用会话之前保持会话,因此不会发出会话cookie(如果它不存在)。第一次使用 会话时,会在服务器上创建会话并发布会话cookie。
现在,当前一个会话重新启动但未使用时,ASP.NET会有点困惑。它会尝试立即放弃未使用的(重新启动的)会话,因为它不需要,这会引发早期的Session_End。但是,它不会删除预先存在的会话cookie,因此每个后续请求都会重复序列,重新启动然后终止会话,直到删除cookie或使用会话为止。
在.Net 4.0中,此行为已更改,并且在这种情况下事件不再触发。