【发布时间】: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