使用.NET 4.5和IIS在MVC中应用程序死锁

时间:2013-03-07 19:40:20

标签: c# asp.net .net asp.net-mvc iis

最近将应用程序更新到.NET 4.5后,我开始注意到一些与控制器(及其相关的操作)相关的奇怪行为在来自Javascript的AJAX调用期间被“阻止”。

问题通常是不一致的,但如果通过异步AJAX调用访问Controller会导致问题,并且在此请求期间会发生另一个调用(通过AJAX或传统上)。

这导致原始呼叫被“阻止”,并且通常需要1-2分钟才能解决此“死锁”并且操作按预期执行。

示例方案

  • 用户点击暂时存储值的链接 要在下一个请求中访问的ViewData。

  • 发生重定向并访问另一个Controller(,因为它应该),并在加载AJAX后调用。

  • 在此AJAX调用(正确访问ViewData值)期间,会快速进行其他调用(,例如用户立即单击链接以导航到另一个Controller )。单击此链接后,将出现“死锁”,浏览器将无响应。

  • 呼叫将成功执行(只要它不被其他请求中断),但尝试执行上述步骤将失败。

其他信息

  • 如上所述,这个问题会很不一致 通常在第一个请求(AJAX调用)上正确执行 只要它不被打断。但是,如果你试图制作 再次打电话会失败。

  • 使用Browser Profiler / Fiddler /开发工具(F12),正在进行第二次AJAX调用,但它似乎永远不会执行。 (即使在AJAX调用中放置一个断点,但是尽管调用了断点,但是从不会命中断点)。

  • 此问题仅在Internet Explorer 9或更低版本中发生。

  • 应用程序使用的是MVC3,.NET Framework 4.5,IIS 7.5,是在Visual Studio 2012中开发的。

尝试解决方案

  • SessionState - 尝试使用SessionStateBehavior.ReadOnly来避免可能在相关控制器上发生的任何阻塞问题。

  • 临时存储 - 使用各种不同的方法在控制器之间传递临时值,例如ViewData,Session和Cache。

  • ITempDataProvider - 目前正在考虑实施提供商来处理任何临时值,以便可以将项目迁移到更无会话的解决方案。


更新

在与ASP.NET团队的几个成员和其他一些社区贡献者协商后,确定该问题实际上是.NET 4.5中的一个错误。

您可以在this blog post that I wrote up on this same topic and the updated fix here中了解有关该问题的更多信息。

1 个答案:

答案 0 :(得分:5)

我们在测试和生产环境中遇到过类似的问题。我们注意到它只安装了一次.net 4.5。 (删除.net 4.5可修复此问题。)如果在Visual Studio Development Server中调试应用程序或将AppPool设置为经典模式,则不会发生此问题。它似乎与集成模式下的AppPool与IIS 7.5和.net 4.5相关。

我发现其他人有问题,但没有明确的答案。 IE double postback hangs IIS 7 in Integrated Managed pipeline mode when session is accessed