代码之家  ›  专栏  ›  技术社区  ›  Jaap Stewie

大量会话\使用相同的会话ID启动

  •  5
  • Jaap Stewie  · 技术社区  · 15 年前

    我正在开发盒上运行一个ASP.NET网站(vista/iis7上的.NET 2.0)。 global.asax.cs中的session-start方法记录对文件(log4net)的每次调用。 会话结束方法还记录每个调用。

    我正在使用inproc会话状态,并将会话超时设置为5分钟(以避免等待20分钟)。

    我点击网站,等待5分钟,我看到会话结束日志。然后我去了网站。浏览器仍然有会话cookie并将其发送到服务器。调用会话启动,并使用相同的会话ID创建新会话(btw:我需要使用相同的会话ID,因为它用于在数据库中存储数据)。

    结果: 每次我在之前结束的会话中按F5时,都会调用会话\u start方法,执行请求并立即调用会话\u end方法。

    当我打开另一个浏览器时,会话启动方法只调用一次。然后在5分钟后,会话结束每个F5会导致会话开始/请求/会话结束序列执行。

    web.config相关部分:

    <system.web>
      <compilation debug="true" />
      <sessionState timeout="2" regenerateExpiredSessionId="false" />
    </system.web>
    
    1 回复  |  直到 13 年前
        1
  •  6
  •   TheCodeKing    13 年前

    这个 regenerateExpiredSessionId 设置与 cookieless URLs only ,它不会影响将被重用的会话cookie的行为。

    您遇到的问题是因为ASP.NET 2.0/3.5根据会话是否在使用中处理会话的方式。在正常情况下,它在第一次使用会话之前不会尝试持久化会话,因此不会发出会话cookie(如果它不存在)。第一次会议 使用时,将在服务器上创建会话并发出会话cookie。

    现在,当上一个会话重新启动但不使用时,ASP.NET会有点混乱。它试图立即放弃未使用(重新启动)的会话,因为它不是必需的,这会导致早期会话结束。但是,它不会删除预先存在的会话cookie,因此每个后续请求都会重复该序列,重新启动,然后终止会话,直到cookie被删除或会话被使用为止。

    在.NET 4.0中,此行为已更改,在此情况下,事件不再激发。