【问题标题】:Application Deadlocks within MVC using .NET 4.5 and IIS使用 .NET 4.5 和 IIS 的 MVC 中的应用程序死锁
【发布时间】:2013-03-07 19:40:19
【问题描述】:

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

这些问题通常是不一致的,但如果通过异步 AJAX 调用访问控制器并且在此请求期间进行了另一个调用(通过 AJAX 或传统方式),则会出现这些问题。

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

示例场景

  • 用户单击一个链接,该链接将临时存储一个值
    ViewData 将在下一个请求中访问。

  • 发生重定向并访问另一个控制器(应该如此),加载后进行 AJAX 调用。

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

  • 调用将成功执行(只要它没有被另一个请求中断),但尝试执行前面的步骤将失败。

其他信息

  • 如前所述,这个问题相当不一致,因为它会 通常在第一个请求 (AJAX 调用)上正确执行 只要不中断。但是,如果您尝试使 再次调用同样会失败。

  • 使用浏览器分析器/提琴手/开发工具 (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 中阅读有关该问题的更多信息。

【问题讨论】:

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


    【解决方案1】:

    我们在测试和生产环境中也遇到过类似问题。我们注意到只有在安装 .net 4.5 后才会发生这种情况。 (删除 .net 4.5 修复了该问题。)如果您在 Visual Studio 开发服务器中调试应用程序或将 AppPool 设置为经典模式,则不会发生这种情况。它似乎与集成模式下的 AppPool 的 IIS 7.5 和 .net 4.5 有关。

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

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多