【发布时间】:2014-12-15 18:16:00
【问题描述】:
我有一个 ASP.NET 应用程序,它似乎在另一个会话中间开始一个新会话。
使用表单身份验证。
身份验证超时 = 120。sessionState 超时 = 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 值?
恐怕我不能比这更具体,但我希望以上信息至少能消除谈话中的一些常见嫌疑人。
【问题讨论】:
-
您使用网络农场吗?还是负载均衡器?
-
@WiktorZychla:不,我认为 User-Agent 字符串与此无关。正如我所写,该问题影响到 IE9、IE10 和 IE11——而不仅仅是 IE11。不过谢谢你的建议。
-
@Rex:不。没有网络花园/农场和负载平衡器。这是一个带有 IIS 7.5 的本地 Win7 x64 开发系统。对于正在使用的应用程序池,Maximum Worker Processes 设置为 1。这是一个特定于应用程序的应用程序池 - 不是 DefaultAppPool 或与其他应用程序共享的应用程序池。
-
@JoergenBech 尝试将会话存储在 sql server 或检查此链接:stackoverflow.com/questions/454616/…
标签: c# asp.net cookies session-timeout asp.net-session