我对我的发展框(在Vista / IIS7 .NET 2.0)运行ASP.NET网站。 在该的global.asax.cs方法在session_start记录每次调用文件(log4net的)。 该方法Session_End中也记录每个呼叫。

我使用InProc会话状态,并且所述会话超时值设置为5分钟(以避免在等待20分钟)。

我打的网站,等待5分钟单元I看到Session_End中日志记录。然后我F5的网站。该浏览器仍然有会话cookie,并将其发送给服务器。在session_start被调用并使用相同的会话id,创建新的会话。(顺便说一句:我需要这是相同的会话ID,因为它是用来将数据存储在数据库中)

结果: 每次打F5上前面结束的会话时,在session_start方法被调用时,执行该请求和Session_End中方法被立即调用。

当我打开不同的浏览器时,在session_start方法被调用一次。然后在5分钟后的各Session_End中F5使在session_start /请求/ Session_End中顺序执行。

的web.config相关部分:

<system.web>
  <compilation debug="true" />
  <sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>
有帮助吗?

解决方案

regenerateExpiredSessionId设置涉及 cookie的唯一网址时,它不影响将被再利用的会话cookie的行为。

您所遇到的问题是因为ASP.NET 2.0 / 3.5处理基于它是否是在使用会话的方式。在正常情况下它不会尝试坚持一个会话中第一次它的使用,直到,因此不会发出会话cookie(如果不存在的话)。第一次会话的所使用的,是在服务器和发出的会话cookie上创建的会话。

现在,当以前的会话重新启动,但不使用,则ASP.NET会有点困惑。它试图马上放弃,因为它不是必需的未使用的(重启)会议,这引起了一个Session_End中上旬。然而,它没有删除现有的预会话cookie,并且因此每个后续请求重复序列,重新启动,并然后终止该会话,直到该cookie被删除或为使用的会话。

在.NET 4.0这种行为发生了改变,并且在这种情况下,事件不再火灾。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top