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

Rio*_*ams 9 .net c# asp.net iis asp.net-mvc

在最近将应用程序更新到.NET 4.5时,我开始注意到一些与控制器(及其相关的Actions)相关的奇怪行为在来自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中的一个错误.

您可以在此博客文章中阅读有关此问题的更多信息,我在此处撰写了相同的主题和更新的修补程序.

Bla*_*son 5

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

我发现其他人有问题,但没有明确的答案. 当访问会话时,IE双回发会在集成管理管道模式下挂起IIS 7