0

我有一个 ASP.NET 应用程序,它似乎在另一个会话中间开始一个新会话。

  • 使用表单身份验证。

  • 身份验证超时 = 120。会话状态超时 = 130。

  • sessionState 模式 = InProc。

  • cookieless = false(应该与 UseCookies 相同)。

  • 仅在访问十几个其他页面后访问特定页面时才会发生。但是,如果我在访问否则失败的页面之前访问其他页面,则不会发生错误。

  • 不是由于应用程序池回收。我连续几个小时运行相同的 w3wp 进程。运行状况监控日志没有显示任何内容。

  • 在 F12 开发人员工具中使用网络功能时,所有 cookie 值在从一个会话到下一个会话的转换中仍然存在,但在故障点,cookie 视图显示“已接收:ASP.NET_SessionId”,而同一请求中的所有其他值显示作为“发送”。

  • 一切都发生在同一个域中(在本例中为 localhost)。

  • 对象在用户登录后几乎立即存储在 Session 对象中,因此这不是由于未使用的 Session 对象而导致每个请求的 ASP.NET_SessionId 更改的情况之一。

  • Windows 7 x64 开发系统上的 IIS 7.5。完全最新的所有 Windows 更新。

  • 我已在 Global.asax 中的所有全局事件中添加了调试语句,并且没有迹象表明我的任何代码导致会话 ID 在请求过程中丢失。我只是在调用特定函数时得到一个新的 Session_Start 事件,即使到目前为止已经成功处理了数十个请求。

示例用户代理字符串 (Chrome):“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36”

示例用户代理字符串 (Internet Explorer):“Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko”

使用 Internet Explorer 9、10 和 11 可以始终如一地重现该问题。我没有尝试过旧版本的 Internet Explorer。

使用最新版本的 Firefox 或 Chrome无法重现该问题。

是否有一个我可以检查的列表,以便找出为什么 ASP.NET 认为它需要在运行 Internet Explorer 但没有其他浏览器类型时启动一个新会话并分配一个新的 ASP.NET_SessionId 值?

恐怕我不能比这更具体,但我希望以上信息至少可以消除谈话中的一些常见嫌疑人。

4

1 回答 1

0

问题原来是 Internet Explorer 中的 50 个 cookie 限制。

在 Internet Explorer 中 cookie 的数量和大小限制中进行了描述

Internet Explorer 将每个域的cookie 限制从 20 增加到 50

cookie 的过度使用导致每次访问功能时都会添加多个 cookie,这就是为什么它需要进行大量测试才能到达会话 id 被 cookie 集合中新键的到来推出的点.

Chrome 有 180 个 cookie 的限制,而 Firefox 有 150 个 cookie 的限制,这解释了为什么该应用程序的运行时间比 Internet Explorer 的情况要长得多。

可以使用浏览器 Cookie 限制页面测试给定浏览器的限制。

我在接受的答案中找到了该链接,现代浏览器中当前的 cookie 限制是什么?

于 2014-10-29T08:57:15.460 回答