在最近将应用程序更新到 .NET 4.5 后,我开始注意到在来自 Javascript 的 AJAX 调用期间与控制器(及其关联的操作)相关的一些奇怪行为被“阻止”。
这些问题通常是不一致的,但如果通过异步 AJAX 调用访问控制器并且在此请求期间进行了另一个调用(通过 AJAX 或传统方式),则会导致这些问题。
这导致原始呼叫被“阻止”,通常需要 1-2 分钟才能解决此“死锁”并按预期执行操作。
示例场景
用户单击一个链接,该链接将在 ViewData 中临时存储一个值,
以便在下一个请求时访问。发生重定向并访问另一个控制器(应该如此)并在加载 AJAX 调用后进行。
在此 AJAX 调用(正确访问 ViewData 值)期间,会快速进行其他调用(例如用户立即单击链接以导航到另一个控制器)。单击此链接后,将出现“死锁”,浏览器将变得无响应。
或者
调用将成功执行(只要它没有被另一个请求中断),但尝试执行前面的步骤将失败。
附加信息
如前所述,这个问题是相当不一致的,因为它通常会在第一个请求(AJAX 调用)上正确执行,只要它没有被中断。但是,如果您尝试再次拨打相同的电话,它将失败。
使用 Browser Profiler / Fiddler / Development Tools (F12),第二个 AJAX 调用正在进行,但它似乎从未执行。(即使在 AJAX 调用中放置断点,但是尽管调用了断点,但永远不会命中)。
此问题仅在 Internet Explorer 9 或更低版本中发生。
该应用程序使用 MVC3、.NET Framework 4.5、IIS 7.5 并在 Visual Studio 2012 中开发。
尝试的解决方案
SessionState - 尝试用于
SessionStateBehavior.ReadOnly
避免可能在相关控制器上发生的任何阻塞问题。临时存储- 使用各种不同的方式在 Controller 之间传递临时值,例如 ViewData、Session 和 Cache。
ITempDataProvider - 目前正在考虑实现一个提供程序来处理任何临时值,以便可以将项目迁移到更加无会话的解决方案。
更新
在咨询了 ASP.NET 团队的几位成员和一些其他社区贡献者后,确定该问题实际上是 .NET 4.5 中的一个错误。
您可以在我就同一主题撰写的这篇博客文章中阅读有关该问题的更多信息,并在此处更新修复。