【问题标题】:ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress如果 IE9 用户在调用正在进行时离开页面,则 AJAX POST 的 ManagedPipelineHandler 崩溃
【发布时间】: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


【解决方案1】:

这似乎是 ASP.NET 4.5 中的回归。我们的团队正在开发补丁,但作为临时解决方法,请尝试将此行放在 Web.config 中(更多信息here):

<system.webServer>
  <serverRuntime uploadReadAheadSize="0" />
</system.webServer>

如果这对您有用,请告诉我们!

【讨论】:

  • 我必须更新我的 IISExpress 实例的 applicationhost.config 文件才能解锁它,但这成功了。谢谢您的帮助。使用经典模式也可以,但我希望我不必走那么远。
  • 顺便说一句,非常感谢您的日志!他们确实帮助我们快速解决了这个问题。 :)
  • 不客气 - 你确实很快解决了我将它发布到 SO 甚至懒得在 Connect 上打开一些东西。这几乎就像你们很无聊并且积极寻找要修复的东西:)
  • 这是否也可能是 .NET 4.0 或仅 .NET 4.5 中的问题?我们在 .NET 4.0 中看到了类似的情况,并且一直在测试升级到 4.5.1,但不确定这是否会为我们解决这个问题,因为我们还没有使用 .NET 4.5。
  • Bernd,导致本文所述问题的特定问题仅限于 4.5。它已在 4.5.1 中修复。如果您在 4.0 上看到问题,请打开一个新的 SO 问题。
【解决方案2】:

Levi 的答案在 IIS 7.5 或更高版本中效果很好。但如果您运行的是 Server 2008 R1,以下命令也会设置设置:

c:\windows\system32\inetsrv\appcmd.exe set config "sitename" -section:system.webServer/serverRuntime /uploadReadAheadSize:"0" /commit:apphost 

但是,更好的解决方法是应用 Microsoft 的修补程序来解决问题(附加知识库文章中的#6)

http://support.microsoft.com/kb/2828841/EN-US
http://support.microsoft.com/kb/2828842/EN-US

【讨论】:

  • 无法下载热修复。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多