使用.net 4.5和IIS的MVC中的应用死锁
本文关键字:MVC 应用 死锁 IIS net 使用 | 更新日期: 2023-09-27 18:02:44
在最近将一个应用程序更新到。net 4.5时,我开始注意到一些与控制器(和它们关联的action )相关的奇怪行为在Javascript的AJAX调用中被"阻止"。
问题通常是不一致的,但如果通过异步AJAX调用访问控制器,并且在此请求期间进行了另一个调用(通过AJAX或传统的),则会导致此问题。
这导致原始调用被"阻塞",通常需要1-2分钟才能解决这个"死锁"并按预期执行操作。
示例场景
用户点击一个链接,该链接将临时存储一个值在
重定向发生,另一个控制器被访问(,因为它应该是),加载后进行AJAX调用。
在这个AJAX调用(正确访问ViewData值)期间,一个额外的调用被快速进行(例如用户立即单击链接导航到另一个控制器)。点击此链接后,将发生"死锁",浏览器将变得无响应。
或
调用将成功执行(只要它没有被另一个请求中断),但尝试执行前面的步骤将失败。
附加信息strong>
如前所述,这个问题是相当不一致的通常在第一个请求(AJAX调用)上正确执行只要不被打断就行。但是,如果您试图使
使用浏览器分析器/小提琴手/开发工具(F12),第二个AJAX调用正在进行,但它似乎从未执行。(即使在AJAX调用中放置了一个断点,但是尽管进行了调用,断点也永远不会被击中)。
此问题仅发生在Internet Explorer 9或以下版本
应用程序使用MVC3, . net Framework 4.5, IIS 7.5,并在Visual Studio 2012中开发。
试图解决方案/strong>
SessionState -尝试使用
SessionStateBehavior.ReadOnly
来避免任何可能发生在相关控制器上的阻塞问题。临时存储 -使用各种不同的方法在控制器之间传递临时值,如ViewData, Session和Cache。
ITempDataProvider -目前正在考虑实现一个提供者来处理任何临时值,以便项目可以迁移到一个更无会话的解决方案。
更新
在与ASP的几个成员协商后。.NET团队和其他一些社区贡献者进行了讨论,并确定该问题实际上是。NET 4.5中的一个错误。
你可以阅读更多关于这个问题的博客文章,我写了同样的主题和更新修复在这里。
我们在测试和生产环境中也遇到了类似的问题。我们注意到只有在。net 4.5安装后才会发生这种情况。(移除。net 4.5修复了这个问题。)如果您在Visual Studio Development Server中调试应用程序或将appool设置为经典模式,则不会发生这种情况。它似乎与IIS 7.5和。net 4.5与applool集成模式有关。
我发现其他人也有问题,但没有明确的答案。当会话被访问时,IE双回发会以集成管理管道模式挂起IIS 7