最近、アプリケーションを.NET 4.5に更新すると、JavascriptからのAJAX呼び出し中に、コントローラー(およびそれに関連するアクション)が「ブロック」されることに関連する奇妙な動作に気づき始めました。
多くの場合、問題は一貫していませんでしたが、コントローラーが非同期AJAX呼び出しを介してアクセスされ、この要求中に別の呼び出し(AJAXまたは従来の方法)が行われた場合に発生します。
これにより、元の呼び出しが「ブロック」され、この「デッドロック」が解決されてアクションが意図したとおりに実行されるまで、通常1〜2分かかります。
シナリオ例
ユーザーは
、次のリクエストでアクセスされるViewDataに値を一時的に保存するリンクをクリックします。リダイレクトが発生し、別のコントローラーにアクセスし(必要に応じて)、ロード後にAJAX呼び出しが行われます。
このAJAX呼び出し(ViewData値に適切にアクセスする)の間に、追加の呼び出しがすばやく行われます(ユーザーがすぐにリンクをクリックして別のコントローラーに移動するなど)。このリンクをクリックすると、「デッドロック」が発生し、ブラウザが応答しなくなります。
また
呼び出しは正常に実行されますが(別の要求によって中断されない限り)、前の手順を実行しようとすると失敗します。
追加情報
前述のように、この問題は、中断されない限り、通常、最初のリクエスト(AJAX呼び出し)で適切に実行されるため、かなり一貫性がありません。ただし、同じ呼び出しを再度行おうとすると失敗します。
Browser Profiler / Fiddler / Development Tools(F12)を使用して、2番目のAJAX呼び出しが行われていますが、実行されているようには見えません。(AJAX呼び出し内にブレークポイントを配置する場合でも、呼び出しが行われているにもかかわらず、ブレークポイントがヒットすることはありません)。
この問題は、InternetExplorer9以下でのみ発生します。
アプリケーションはMVC3、.NET Framework 4.5、IIS 7.5を使用しており、VisualStudio2012で開発されました。
試みられた解決策
SessionState-
SessionStateBehavior.ReadOnly
問題のコントローラーで発生する可能性のあるブロッキングの問題を回避するために使用しようとしました。一時ストレージ-ViewData、Session、Cacheなど、さまざまな手段を使用してコントローラー間で一時値を渡しました。
ITempDataProvider-現在、プロジェクトをよりセッションレスなソリューションに移行できるように、一時的な値を処理するプロバイダーの実装を検討しています。
アップデート
ASP.NETチームの数人のメンバーと他の数人のコミュニティの貢献者と相談し、問題が実際には.NET4.5内のバグであると判断した後。
この問題について詳しくは、私がこの同じトピックについて書いたこのブログ投稿と、更新された修正をここで読むことができます。