2011-07-11 29 views
2

私は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の最初の呼び出しの前であっても、決してブレークしませんでした。

+2

ページ上の別の要素のリクエストやfavicon.icoなどのセカンダリリクエストの結果として呼び出されている可能性があります。ビジュアルスタジオの[デバッグ]メニューに移動し、[例外]をクリックすると、デバッガにすべての例外を強制的に破棄させることができます。そこから、 "共通言語ランタイムの例外"の "Thrown"をチェックすることができます。これにより、AFAIKスレッドでスローされたすべての例外がキャッチされます。 – gordonmleigh

+0

@ gordonml:そうではありません。 Application_Errorのこれらの2つの呼び出しは、1つの要求を処理する過程で発生します。両方の呼び出しには同じ応答オブジェクトがあり、2回目の呼び出しで最初の呼び出しが応答に書き込んだものはすべて破棄できます。 – chiccodoro

+0

これで運が良かったですか? @chiccodoro私は同じ問題を抱えています。 –

答えて

0

まったく同じことが私に起こった。

私のソリューションは、例外がサーバーにAJAX呼び出し内でスローされた場合には

(私はそれを好きではないが、私はif(exception == null) return;よりも良い、それが好き)以下、私はちょうどResponse.StatusCode = (int)401を取り除きました。

これは、Global.asax.csにあります。これは、APIセッションがhttpセッションよりも早く期限切れになることがあるためです。 Response.StatusCode = 500に設定すると、Application_Errorは2回起動しません。

0

Web.configには、カスタムエラーを定義する2つの方法があります。それらのうちの1つだけが存在することを確認します。そうでない場合は、対応するエラーが2回呼び出されます。

<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL"> 
    <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" /> 
    ... 
</httpErrors> 


<customErrors mode="On"> 
    <error redirect="~/Error/NotFound" statusCode="404" /> 
    ... 
</customErrors>