在最近将应用程序更新到.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中的一个错误.
您可以在此博客文章中阅读有关此问题的更多信息,我在此处撰写了相同的主题和更新的修补程序.
这种情况在最近几天开始发生; 可能是因为我安装了Visual Studio 2012.它目前只发生在我的机器上(我的同事们都在VS 2010上),但我希望卸载VS 2012,看看是否有影响.
我的所有Web请求中约有50%在SessionStateModule/REQUEST_AQUIRE_STATE中挂起约100秒(然后页面成功完成).
ANTS Profiler一直报告为"等待同步",并在一些IIS线程回调中给出了堆栈跟踪(我们的代码都没有;遗憾的是我没有信息可用).
我为所有请求启用了IIS失败请求跟踪,并重新加载了我们应用的同一页面10次.请求3,5,7,9全部耗时> 100秒,其他请求耗时<5秒.
我们正在使用In Process会话,因此没有任何内容通过网络或被序列化.据我所知,在发生这种情况之前,我们的代码都没有运行过.
如何获得有关调试问题的更多信息?
可能相关: