シナリオ:
- ユーザーは IE9 を使用しています (IE8/10 は影響を受けません)。
- ユーザーはアクティブなセッションを持っています。
SessionState(SessionStateBehavior.Required)
ページは、属性 (影響を受けない) を持つコントローラーへの AJAX POST (影響を受けない GET) 要求を開始しますReadOnly
。このリクエストがすぐに処理されないことがあります (セッションがロックされている進行中の別のリクエストなど)。- その AJAX POST の進行中に、ユーザーはページから移動します (GET または POST - 関係ありません)。
結果:
- AJAX POST が終了し、HTTP 500 を返します (ブラウザはリッスンを終了しましたが、IIS ログで確認できます)。IIS Failed Request Tracing は、「指定されたネットワーク名は利用できなくなりました。(0x80070040)」というエラーを示しています。
- ユーザーのセッションは、読み取り/書き込みセッション アクセスを必要とする次の要求が実行される前に、80 ~ 120 秒 (通常は約 100 秒) の間ロックされます。
IIS Failed Request Tracing によって作成されたログをさらに掘り下げると、セッション状態がロックされた後REQUEST_ACQUIRE_STATE
(フェーズ中に) AJAX POST がこのようにクラッシュすることが示されますが、REQUEST_RELEASE_STATE
フェーズが発生しないため、セッション ロックは解放されません。80 ~ 120 秒後にセッションのロックを解除する安全メカニズムが働いていると思いますが、この非常に長いハングはユーザーにとって明らかに望ましくありません。
https://github.com/jorupp/Ie9SessionCrashで入手可能な問題を示す単純な VS2012/.Net 4.5/MVC4 プロジェクトがあります(Sleep 呼び出しを使用してアクションへの一連の投稿を行う 1 つのページがあります)。問題を示す IIS Failed Request Trace は、https://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500のプロジェクトにあります。
この問題を回避するために、セッションを必要とするアクションへの AJAX POST 呼び出しを行わないようにすることを計画しています。
- 可能であれば GET 呼び出しを使用する
SessionState(SessionStateBehavior.ReadOnly)
属性を持つコントローラーへの POST 呼び出しの使用。
これに対処するより良い方法はありますか、またはこれに関連する IIS/.Net パッチが不足していますか? または、このシナリオは他の理由で有効ではありませんか? これをフレームワーク/IIS のせいにするのはためらっていますが、自分のコードに問題があることを排除したと思います。