私はApplication_Error
を使用して、ASP.NET MVC 3アプリケーションのエラーを処理します。今日私は、ある特定のエラーの場合、このメソッドが2回呼び出されることに気付きました。先頭にアンダースコアを付けてリソースを要求すると、 _ViewStart.cshtml
。それが二度目に呼ばれていますASP.NET Application_Errorが2回呼び出されました
var exception = server.GetLastError();
server.ClearError();
...
、GetLastError
戻りnull
:
Application_Error
の実装では、最後のサーバーのエラーを消費します。最初に呼び出されると、対応するステータスコードと内容が応答オブジェクトに設定されます。 2番目の呼び出しによって、これらの設定がすべて上書きされました。この問題を回避するには、私は今、NULLポインタのチェック:
if (exception == null) return;
この方法では、それは完全に正常に動作します:メソッドの最初の実行がエラーページの応答を置き換え、ステータスコードを設定します。 2回目は何もしない。その後、正しいステータスコードとエラーページを取得したクライアントに応答が送信されます。
しかし、このコード行は私には汚れているようです。実際に何かが間違っていなければならないときにエラーハンドラを静かに終了させるのではなく、何が起こっているのかを理解することを好むでしょう。
注:エラー処理の最初の実行中にどこにも例外がスローされないようです。そうでなければ私はそれを理解することができたしかし、それを1行ずつデバッグすると、コントローラーへのMVC呼び出しとビューのレンダリングを含む、Application_Error
メソッドが処理されます。実際に、gordonmlのコメントに従って、 "CLR例外がスローされたときにブレーク"フラグをチェックした後、Visual Studioは、Application_Errorの最初の呼び出しの前であっても、決してブレークしませんでした。
ページ上の別の要素のリクエストやfavicon.icoなどのセカンダリリクエストの結果として呼び出されている可能性があります。ビジュアルスタジオの[デバッグ]メニューに移動し、[例外]をクリックすると、デバッガにすべての例外を強制的に破棄させることができます。そこから、 "共通言語ランタイムの例外"の "Thrown"をチェックすることができます。これにより、AFAIKスレッドでスローされたすべての例外がキャッチされます。 – gordonmleigh
@ gordonml:そうではありません。 Application_Errorのこれらの2つの呼び出しは、1つの要求を処理する過程で発生します。両方の呼び出しには同じ応答オブジェクトがあり、2回目の呼び出しで最初の呼び出しが応答に書き込んだものはすべて破棄できます。 – chiccodoro
これで運が良かったですか? @chiccodoro私は同じ問題を抱えています。 –