8

シナリオ:

  • ユーザーは 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 のせいにするのはためらっていますが、自分のコードに問題があることを排除したと思います。

4

2 に答える 2

7

これは、ASP.NET 4.5 での回帰のようです。私たちのチームはパッチに取り組んでいますが、一時的な回避策として、次の行を Web.config に配置してみてください (詳細はこちら):

<system.webServer>
  <serverRuntime uploadReadAheadSize="0" />
</system.webServer>

これがうまくいくかどうかお知らせください!

于 2013-03-18T18:39:42.823 に答える
2

Levi's answer は、IIS 7.5 以降でうまく機能します。ただし、Server 2008 R1 を実行している場合は、次のコマンドでも設定が行われます。

c:\windows\system32\inetsrv\appcmd.exe set config "sitename" -section:system.webServer/serverRuntime /uploadReadAheadSize:"0" /commit:apphost 

ただし、問題を解決する Microsoft のホットフィックスを適用することをお勧めします (添付の KB 記事の #6)。

http://support.microsoft.com/kb/2828841/EN-US
http://support.microsoft.com/kb/2828842/EN-US

于 2013-07-15T14:37:57.743 に答える