6

Chciałbym mieć 1 stronę błędu, która w zależności od podanego ciągu zapytania wyświetla nieco inny komunikat o błędzie dla użytkownika.Mylić z obsługą błędów w ASP.net 5 MVC 6

Zauważyłem następujący kod w pliku Startup.cs podczas tworzenia nowego projektu asp.net 5.

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

Byłem w stanie uzyskać to, aby wyświetlić prawidłową stronę błędu, gdy wystąpi wyjątek. Moim problemem jest to, że wydaje się wychwycić tylko błędy, które nie zostały obsłużone w mojej aplikacji, tj. Zawsze z kodem statusu 500. Czy to jest poprawne?

Aby obsłużyć 404 błędów używam następujący kod:

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

Z mojego kontrolera realizowane jako:

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

Wydaje się złapać 404 błędy i wyświetla prawidłowy kod stanu.

Jeśli zaktualizować kod w powyższym if korzystać z tego samego działania na przykład:

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

Kod stanu zwracane jest zawsze 0.

Ponadto, co się stanie, gdy 400, 403 lub jakakolwiek inna występuje? Czy zostaną złapani? Jeśli tak, w którym momencie zostaną złapani?

Jak można stwierdzić, jestem bardzo zdezorientowany i chciałbym, aby ktoś podał mi przykład, w którym obsługiwane są wszystkie różne kody statusu.

+0

Wont połowu błąd globaly w przypadku Application_Error wewnątrz global.asax pomoc? http://stackoverflow.com/questions/16884074/asp-net-mvc-application-error-handler-in-global-asax –

+0

To wygląda jak asp.net MVC5? –

+0

Czy możesz opublikować kod "UseExceptionHandler"? – Mairaj

Odpowiedz

18

Wygląda na to, że wprowadzasz zamieszanie w nieobsługiwanych wyjątkach (które domyślnie są zwracane do klienta jako błąd HTTP wewnętrznego serwera HTTP 500) i poprawnie obsługują przypadki błędów spowodowane nieprawidłową akcją w imieniu użytkownika/klienta (gdzie kod HTTP 4xx jest zwracany użytkownikowi).

Tylko ten pierwszy z nich ma coś wspólnego z wywołaniem UseExceptionHandler - domyślnie przechwytuje wszelkie nieobsługiwane wyjątki i kieruje je do tego, co podajesz (w twoim przypadku widok, ale równie dobrze może być kawałek kodu, który sprawdza nieobsługiwane wyjątki w celu przekonwertowania określonych przypadków błędu na kody powrotu 4xx HTTP - na przykład błędy uwierzytelniania w odpowiedziach HTTP 401).

Funkcja UseStatusCodePagesWithReExecute wprowadzi kod miejsca, w którym wygenerowano kod 400-599, o ile nie wygenerowano już treści odpowiedzi. source code in question pokazuje, jak to się określa.

W swoim drugim bloku kodu, który został użyty UseExceptionHandler - Myślę, że nie powinno być następujące:

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

OK, większość z tego, co powiedziałeś, ma sens. Moje jedyne pytanie brzmi: jakie kody błędów będą zawierały ten wiersz kodu: app.UseStatusCodePagesWithReExecute ("/ Błąd/{0}"); złapać inne niż 404? –

+2

Oto [ostateczna odpowiedź] (https://github.com/aspnet/Diagnostics/blob/dev/src/Microsoft.AspNetCore.Diagnostics/StatusCodePage/StatusCodePagesMiddleware.cs#L42) na tym - wszystko, co ma kod statusu od 400 do 600 włącznie, gdzie nie wygenerowano już treści odpowiedzi, będą obsługiwane przez UseStatusCodePages. Zaktualizuję odpowiedź, aby to odzwierciedlić. –

+0

Precyzyjna odpowiedź thnx @MarkHughes – Drakoumel