Mam podstawowy kod do określenia błędów w mojej aplikacji MVC. Obecnie w moim projekcie mam kontrolera nazywane Error
metodami działania HTTPError404()
, HTTPError500()
oraz General()
. Wszystkie akceptują parametr łańcuchowy error
. Używanie lub modyfikowanie poniższego kodu. Jaki jest najlepszy / właściwy sposób przekazania danych administratorowi błędów do przetwarzania? Chciałbym mieć rozwiązanie tak solidne, jak to tylko możliwe.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to properly pass route data to error controller?
}
}
źródło
Aby odpowiedzieć na wstępne pytanie „jak prawidłowo przekazać dane trasowane do kontrolera błędów?”:
Następnie w swojej klasie ErrorController zaimplementuj taką funkcję:
Spowoduje to umieszczenie wyjątku w widoku. Stronę widoku należy zadeklarować w następujący sposób:
A kod do wyświetlenia błędu:
Oto funkcja, która zbiera wszystkie komunikaty o wyjątkach z drzewa wyjątków:
źródło
Znalazłem rozwiązanie problemu AJAX, które odnotował Lion_cl.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
źródło
Wcześniej zmagałem się z pomysłem scentralizowania globalnej procedury obsługi błędów w aplikacji MVC. Mam post na forach ASP.NET .
W zasadzie obsługuje wszystkie błędy aplikacji w global.asax bez potrzeby używania kontrolera błędów, dekorowania
[HandlerError]
atrybutem lub majstrowania przycustomErrors
węźle w web.config.źródło
Być może lepszym sposobem obsługi błędów w MVC jest zastosowanie atrybutu HandleError do kontrolera lub akcji i zaktualizowanie pliku Shared / Error.aspx, aby robić to, co chcesz. Obiekt Model na tej stronie zawiera właściwość Exception, a także ControllerName i ActionName.
źródło
404
błędem? skoro nie ma kontrolera / akcji do tego wyznaczonej?Perhaps a better way of handling errors
brzmi prawie jak Wszystkie błędy, a nie tylko 500.Błąd aplikacji związany z żądaniami Ajax. Jeśli błąd został obsłużony w akcji, która została wywołana przez Ajax - wyświetli widok błędu wewnątrz powstałego kontenera.
źródło
To może nie być najlepszy sposób dla MVC ( https://stackoverflow.com/a/9461386/5869805 )
Poniżej przedstawiono sposób renderowania widoku w Application_Error i zapisywania go w odpowiedzi http. Nie musisz używać przekierowania. Zapobiegnie to drugiemu żądaniu do serwera, więc łącze w pasku adresu przeglądarki pozostanie niezmienione. To może być dobre lub złe, zależy od tego, czego chcesz.
Global.asax.cs
Widok
źródło
Brian, To podejście działa świetnie w przypadku żądań innych niż Ajax, ale jak stwierdził Lion_cl, jeśli wystąpi błąd podczas wywołania Ajax, widok Share / Error.aspx (lub niestandardowy widok strony błędu) zostanie zwrócony do dzwoniącego Ajax. -użytkownik NIE zostanie przekierowany na stronę błędu.
źródło
Użyj następującego kodu do przekierowania na stronie trasy. Użyj wyjątku Komunikat zamiast wyjątku. Ciąg zapytania o wyjątek Coz powoduje błąd, jeśli rozszerza długość zapytania.
źródło
Mam problem z tym podejściem do obsługi błędów: W przypadku pliku web.config:
Procedura obsługi błędów przeszukuje widok Error.shtml, a przepływ sterowania przechodzi do Application_Error global.asax tylko po wystąpieniu wyjątku
Więc
httpException ma zawsze wartość null, a następnie customErrors mode = "On" :( Jest to mylące Wtedy
<customErrors mode="Off"/>
lub<customErrors mode="RemoteOnly"/>
użytkownicy widzą customErrors html, Wtedy customErrors mode = "On" ten kod też jest nieprawidłowyKolejny problem z tym kodem
Wróć do strony z kodem 302 zamiast prawdziwego kodu błędu (402,403 itd.)
źródło