【问题标题】:Large number of Session_Start with same session id具有相同会话 ID 的大量 Session_Start
【发布时间】:2011-01-15 05:17:46
【问题描述】:

我在我的开发机器上运行一个 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>

【问题讨论】:

  • 我在同样的问题上需要帮助,但在我没有弄乱会话的网站上。完全随机地,该站点将每天为一个具有一个会话 ID 的用户进行数百次我在 Session_Start 中的数据库事务。没有警告,随机网站受到影响,也没有答案。
  • this link。那里有真正的解决方案。

标签: asp.net session session-cookies session-timeout


【解决方案1】:

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

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

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

在 .Net 4.0 中,此行为已更改,在这种情况下不再触发事件。

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2012-05-01
    • 2011-08-13
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多