【发布时间】:2013-03-15 16:31:10
【问题描述】:
场景:
- 用户正在使用 IE9(IE8/10 不受影响)。
- 用户有一个活动会话。
- 页面向具有
SessionState(SessionStateBehavior.Required)属性(ReadOnly不受影响)的控制器发起 AJAX POST(GET 不受影响)请求。某些因素使该请求无法立即得到处理(例如,另一个正在进行的请求已锁定会话)。 - 当 AJAX POST 正在进行时,用户会离开页面(GET 或 POST - 无关紧要)
结果:
- AJAX POST 终止并返回 HTTP 500(浏览器已退出侦听,但您可以在 IIS 日志中看到它)。 IIS Failed Request Tracing 显示错误为“指定的网络名称不再可用。(0x80070040)。”
- 在执行下一个需要读/写会话访问权限的请求之前,用户的会话被锁定 80 到 120 秒(通常约为 100 秒)。
进一步挖掘由 IIS Failed Request Tracing 创建的日志表明,AJAX POST 像这样在会话状态被锁定(在REQUEST_ACQUIRE_STATE 阶段)之后崩溃,但自从@987654326 @ 阶段没有发生,会话锁没有被释放。我假设有一些安全机制在起作用,它会在 80-120 秒后解锁会话,但我的用户显然不希望这种非常长的挂起。
我有一个简单的 VS2012/.Net 4.5/MVC4 项目,演示了https://github.com/jorupp/Ie9SessionCrash 上的问题(有一个页面发布了一系列关于睡眠调用操作的帖子)。显示该问题的 IIS Failed Request Trace 项目位于https://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500。
为了解决这个问题,我们计划确保我们永远不会对需要会话的操作进行任何 AJAX POST 调用,并且:
- 尽可能使用 GET 调用
- 对具有
SessionState(SessionStateBehavior.ReadOnly)属性的控制器使用POST 调用。
有没有更好的方法来处理这个问题,或者我是否缺少与此相关的 IIS/.Net 补丁?还是由于其他原因,这种情况无效?我不愿为此责怪框架/IIS,但我认为我已经消除了我的代码错误。
【问题讨论】:
-
您知道,这个问题可能还会影响 IE7 和 IE8。我们有一个 [slow to patch] 系统,我们在这两个浏览器中发现了类似的行为。该问题似乎是由浏览器切换页面后完成的未完成的 Ajax 请求引起的。我们可以通过显式取消请求来解决它。在(“高度安全”)客户修补有问题的系统之前,我无法确认这正是这个问题,但它与这个问题的 MO 完全匹配。
-
@philw:我们让它破坏 .Net 4.5 的具体方式(在解决方法或 Levi 提到的补丁之前)没有发生在 IE8 上,但可能有另一种方式导致这种情况(浏览器中途终止请求)。
-
明白。然而,我们现在在 IE7 和 IE8 上都确认了这一点——安装 MS 补丁可以准确地修复它。在我们的案例中,问题恰恰是:“在浏览器停止侦听后返回的飞行请求中”。我们仍然看到(服务器日志中的错误 64),但它不再杀死 IE7 和 IE8,现在我们修补了服务器。
标签: internet-explorer-9 asp.net-4.5 iis-8