Chcę wyświetlić niestandardową stronę błędu dla 500, 404 i 403. Oto, co zrobiłem:
Włączono niestandardowe błędy w pliku web.config w następujący sposób:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>
Zarejestrowany
HandleErrorAttribute
jako globalny filtr akcji wFilterConfig
klasie w następujący sposób:public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
Utworzono niestandardową stronę błędu dla każdego z powyższych komunikatów. Domyślny dla 500 był już dostępny od razu po wyjęciu z pudełka.
W każdym niestandardowym widoku strony błędu zadeklarowano, że jest to model strony
System.Web.Mvc.HandleErrorInfo
W przypadku 500 wyświetla niestandardową stronę błędu. Dla innych tak nie jest.
Czy czegoś brakuje?
Wygląda na to, że to nie wszystko, aby wyświetlić niestandardowe błędy, gdy czytam kod w OnException
metodzie HandleErrorAttribute
klasy i obsługuje on tylko 500.
Co muszę zrobić, aby obsłużyć inne błędy?
źródło
Odpowiedzi:
Moja obecna konfiguracja (na MVC3, ale myślę, że nadal obowiązuje) polega na posiadaniu
ErrorController
, więc używam:Kontroler zawiera następujące elementy:
I widoki dokładnie tak, jak je wdrażasz. Staram się jednak dodawać trochę logiki, aby pokazać informacje o śladzie stosu i błędach, jeśli aplikacja jest w trybie debugowania. Błąd Error.cshtml wygląda mniej więcej tak:
źródło
redirectMode="ResponseRewrite"
naCustomerErrors
elemencie//you may want to set this to 200
w kodzie. NIE RÓB TEGO!Zrobiłem rozwiązanie Pablo i zawsze miałem błąd (MVC4)
Aby się tego pozbyć, usuń linię
w FilterConfig.cs
źródło
Robię coś, co wymaga mniej kodowania niż inne opublikowane rozwiązania.
Po pierwsze, w moim pliku web.config mam następujące elementy:
Kontroler (/Controllers/ErrorPageController.cs) zawiera następujące elementy:
Wreszcie widok zawiera następujące elementy (uproszczone, ale może zawierać:
To jest tak proste. Można go łatwo rozszerzyć, aby oferować bardziej szczegółowe informacje o błędach, ale ELMAH obsługuje to dla mnie, a statusCode i statusDescription to wszystko, czego zwykle potrzebuję.
źródło
Wydaje się, że jest tu kilka pomieszanych kroków. Przedstawię to, co zrobiłem od zera.
Utwórz
ErrorPage
kontrolerDodaj widoki dla tych dwóch akcji (kliknij prawym przyciskiem myszy -> Dodaj widok). Powinny one pojawić się w folderze o nazwie ErrorPage.
Wewnątrz
App_Start
otwórzFilterConfig.cs
i skomentuj filtr obsługi błędów.Wewnątrz web.config dodaj następujące
<customerErrors>
wpisy, w obszarzeSystem.Web
Test (oczywiście). Rzuć nieobsługiwany wyjątek w kodzie i zobacz, jak przechodzi na stronę o identyfikatorze 500, a następnie użyj adresu URL do strony, która nie istnieje, aby wyświetlić 404.
źródło
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.
Wszystko, co odebrałem z twojego kodu, znajduje się w pliku web.config, dodałem<error redirect = "~/ControllerName/ActionName" statusCode="404"/>
i działało dobrze :) Reszta kodu pochodzi z odpowiedzi @ Pablo. Używam MVC 5 i szkieletu encji 6. Niefilters.Add(new HandleErrorAttribute())
FilterConfig.cs
Poleciłbym użyć pliku Global.asax.cs.
źródło
Opierając się na odpowiedzi opublikowanej przez maxspan, przygotowałem minimalny przykładowy projekt na GitHub pokazujący wszystkie działające części.
Zasadniczo po prostu dodajemy
Application_Error
metodę do global.asax.cs, aby przechwycić wyjątek i dać nam możliwość przekierowania (lub bardziej poprawnie, żądania przeniesienia ) na niestandardową stronę błędu.Kontroler błędów:
Wyświetl stronę błędu:
Nic innego nie jest zaangażowany, inne niż wyłączenie / usunięcie
filters.Add(new HandleErrorAttribute())
w FilterConfig.csChociaż jest bardzo prosty do wdrożenia, jedyną wadą, którą widzę w tym podejściu, jest użycie kwerendy do dostarczania informacji o wyjątkach do docelowej strony błędu.
źródło
Miałem wszystko skonfigurowane, ale nadal nie widziałem odpowiednich stron błędów dla kodu statusu 500 na naszym serwerze pomostowym, mimo że wszystko działało dobrze na lokalnych serwerach programistycznych.
Znalazłem ten post na blogu od Ricka Strahla, który mi pomógł.
Musiałem dodać
Response.TrySkipIisCustomErrors = true;
do mojego niestandardowego kodu obsługi błędów.źródło
Oto moje rozwiązanie. Używanie [ExportModelStateToTempData] / [ImportModelStateFromTempData] jest moim zdaniem niewygodne.
~ / Widoki / Strona główna / Error.cshtml:
~ / Kontrolery / HomeController.sc:
~ / Kontrolery / BaseController.sc:
~ / Kontrolery / MyController.sc:
Życzę udanych projektów ;-)
źródło
Błędy mogą działać poprawnie bez włamywania się do pliku global.cs, nie zadzieraj z HandleErrorAttribute, wykonując Response.TrySkipIisCustomErrors, podłączając błąd Application_Error lub cokolwiek innego:
W system.web (zwykłe włączanie / wyłączanie)
oraz w system.webServer
Teraz wszystko powinno działać zgodnie z oczekiwaniami, a za pomocą narzędzia ErrorController możesz wyświetlać wszystko, czego potrzebujesz.
źródło
Wygląda na to, że spóźniłem się na przyjęcie, ale lepiej też to sprawdzić.
Więc
system.web
do buforowania wyjątków w aplikacji, takich jak return HttpNotFound ()i
system.webServer
do nadrabiania błędów, które zostały złapane przez IIS i nie dotarły do frameworka asp.netW tej ostatniej, jeśli martwić odpowiedzi klienta następnie zmienić
responseMode="Redirect"
sięresponseMode="File"
i służyć plik HTML statyczne, ponieważ ten pokaże przyjazną stronę z kodem 200 odpowiedzi.źródło
W pliku web.config dodaj to pod znacznikiem system.webserver, jak poniżej,
i dodaj kontroler jako,
i dodać ich szanowane poglądy, to na pewno zadziała chyba dla wszystkich.
To rozwiązanie znalazłem w: Neptune Century
źródło