ManagedPipelineHandler一个AJAX POST崩溃如果IE9用户从一个页面,而呼

2019-07-21 17:36发布

场景:

  • 用户正在使用IE9(IE8 / 10不受影响)。
  • 用户有一个活跃的会话。
  • 页开始的AJAX POST(GET不受影响)请求与一控制器SessionState(SessionStateBehavior.Required)属性( ReadOnly不受影响)。 东西保持被立即处理(如在进展的另一请求,其具有锁定所述会话)该请求。
  • 而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 (有一个页面,进行了一系列的职位,以行动与睡眠电话)。 显示问题的IIS失败请求跟踪是在项目https://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500 。

要解决这个问题,我们正在规划,以确保我们不会让任何AJAX来电来邮需要会话的行动,并且:

  • 使用GET调用在可能的情况
  • 使用来电来邮有控制器SessionState(SessionStateBehavior.ReadOnly)属性。

有没有更好的办法来解决这个问题,还是我失去了在关系的IIS / .NET补丁呢? 或者是这种情况不适用于其他原因? 我犹豫责怪框架/ IIS这一点,但我想我已经消除了我的代码处于故障。

Answer 1:

这似乎是在ASP.NET 4.5的回归。 我们的团队正在开发一个补丁,但作为一个临时的解决方法试着将Web.config中这条线(详细信息点击这里 ):

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

请让我们知道这对你的作品!



Answer 2:

列维的答案在IIS 7.5或更高版本的伟大工程。 但是,如果你正在运行Server 2008的R1,下面的命令也将设置的设置:

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

但是,一个更好的解决办法是采用微软的修补程序,其救济问题(附知识库文章中#6)

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



文章来源: ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress