6

提供されたクエリ文字列に応じて、ユーザーに少し異なるエラーメッセージが表示される1つのエラーページがあります。ASP.netでのエラー処理と混同5 MVC 6

新しいasp.net 5プロジェクトを作成するときに、Startup.csファイルに次のコードがあることがあります。

if (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    app.UseExceptionHandler("/Home/Error"); 
} 

例外が発生したときに正しいエラーページを表示することができました。私の問題は、自分のアプリケーションで処理されていないエラー、つまり常にステータスコード500を捕捉したように見えるということです。これは正しいです?私のコントローラのように実装して

app.UseStatusCodePagesWithReExecute("/Error/{0}"); 

[HttpGet("{statusCode}")] 
public IActionResult Error(int statusCode) 
{ 
    return View(statusCode); 
} 

これは404エラーをキャッチするようだと、正しいステータスコードを表示し、私は次のコードを使用してい404エラーを処理する

文は、たとえば同じアクションを使用する場合、私は上記の私のコードを更新した場合:

if (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    app.UseExceptionHandler("/Error/{0}"); 
} 

をステータスコードが返されたとき400何が起こるかまた常に0

あり、 403などが発生しますか?彼らは捕らえられるのだろうか?もしそうなら、どんな時に彼らは捕らえられるでしょうか?

私は非常に混乱していると言えるでしょうが、誰かが私にさまざまなステータスコードがすべて処理される例を提供するのが大好きです。

+0

文句を言わないが、Global.asaxのヘルプ内部のApplication_Errorイベントでグローバルにエラーをキャッチ? http://stackoverflow.com/questions/16884074/asp-net-mvc-application-error-handler-in-global-asax –

+0

asp.net MVC5のように見えますか? –

+0

'UseExceptionHandler'のコードを投稿してください。 – Mairaj

答えて

18

未処理の例外(デフォルトではHTTP 500内部サーバーエラーとしてクライアントに返されます)と、ユーザー/クライアントに代わって無効な操作が原因でエラー処理が正しく処理されたようです4xx HTTPコードがユーザーに返されます)。

これらのうちの前者のみが、UseExceptionHandler呼び出しと何らかの関係があります。デフォルトでは、未処理の例外をキャッチして、あなたの提供するものにルーティングします(あなたの場合はビューですが、未処理の例外を検査して、特定のエラーケースをHTTP 4xx戻りコードに変換します(HTTP 401応答への認証エラーなど)。

UseStatusCodePagesWithReExecuteは、レスポンスボディがすでに生成されていない限り、ステータスコードが400-599で生成されたステップを実行します。 source code in questionは、これがどのように決定されるかを示しています。あなたの2番目のコードブロックで

、あなたはUseExceptionHandlerを使用しました - 私はあなたが以下を持ってすべきだと思う:

if (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    // Handle unhandled errors 
    app.UseExceptionHandler("/Home/Error"); 
    // Display friendly error pages for any non-success case 
    // This will handle any situation where a status code is >= 400 
    // and < 600, so long as no response body has already been 
    // generated. 
    app.UseStatusCodePagesWithReExecute("/Error/{0}"); 
} 
+0

あなたが言ったことのほとんどは理にかなっています。私の唯一のクエリは、どのような種類のエラーコードがこのコード行であるかです:app.UseStatusCodePagesWithReExecute( "/ Error/{0}"); 404以外をキャッチ? –

+2

これには、[確定的な回答](https://github.com/aspnet/Diagnostics/blob/dev/src/Microsoft.AspNetCore.Diagnostics/StatusCodePage/StatusCodePagesMiddleware.cs#L42)があります。ステータスコードを持つものレスポンスボディがまだ生成されていない400から600までの値は、UseStatusCodePagesによって処理されます。これを反映するように答えを更新します。 –

+0

正確な答えthnx @MarkHughes – Drakoumel

関連する問題