如果IE9用户在该呼叫正在进行时导航离开页面,则AJAX POST的ManagedPipelineHandler会崩溃

Jon*_*upp 7 internet-explorer-9 asp.net-4.5 iis-8

场景:

  • 用户正在使用IE9(IE8/10不受影响).
  • 用户有一个活动的会话.
  • Page启动对具有SessionState(SessionStateBehavior.Required)属性(ReadOnly不受影响)的控制器的AJAX POST(GET不受影响)请求.有些东西可以防止此请求被立即处理(例如正在进行会话锁定的另一个请求).
  • 当AJAX POST正在进行时,用户导航离开页面(GET或POST - 无关紧要)

结果:

  • AJAX POST终止并返回HTTP 500(浏览器已退出侦听,但您可以在IIS日志中看到它).IIS失败请求跟踪显示错误是"指定的网络名称不再可用.(0x80070040)."
  • 在下一个需要读/写会话访问的请求可以执行之前,用户的会话被锁定在80到120秒之间(通常大约为100).

进一步挖掘IIS失败的请求跟踪创建的日志表明,在会话状态被锁定(在阶段期间)之后,AJAX POST会像这样崩溃REQUEST_ACQUIRE_STATE,但由于REQUEST_RELEASE_STATE阶段没有发生,因此不会释放会话锁定.我假设有一些安全机制可以在80-120秒之后解锁会话,但这个很长时间的挂起显然对我的用户来说是不受欢迎的.

我有一个简单的VS2012/.Net 4.5/MVC4项目,可以在https://github.com/jorupp/Ie9SessionCrash上找到这个问题(有一个页面可以通过Sleep调用发布一系列帖子).显示问题的IIS失败请求跟踪位于https://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500的项目中.

为了解决这个问题,我们计划确保我们永远不会对需要会话的操作进行任何AJAX POST调用,并且:

  • 尽可能使用GET调用
  • 使用POST调用具有该SessionState(SessionStateBehavior.ReadOnly)属性的控制器.

有没有更好的方法来解决这个问题,或者我错过了与此相关的IIS/.Net补丁?或者这种情况是否因其他原因无效?我为此错误地指责框架/ IIS,但我认为我已经消除了我的代码是错误的.

Lev*_*evi 6

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

<system.webServer>
  <serverRuntime uploadReadAheadSize="0" />
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

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