Mam skonfigurowaną niestandardową stronę błędu dla mojej aplikacji:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
W Global.asax, Application_Error (), poniższy kod działa w celu uzyskania szczegółów wyjątku:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
Zanim dojdę do mojej strony błędu (~ / errors / GeneralError.aspx.cs), wartość Server.GetLastError () ma wartość null
Czy jest jakiś sposób, aby uzyskać szczegółowe informacje o wyjątku na stronie błędu, a nie w Global.asax.cs?
ASP.NET 3.5 w systemie Vista / IIS7
asp.net
exception
web-applications
custom-error-pages
Nailitdown
źródło
źródło
Odpowiedzi:
Przyglądając się bliżej mojej konfiguracji web.config, jeden z komentarzy w tym poście jest bardzo pomocny
Więc możemy zmienić,
customErrors
aby dodać ten parametr:ResponseRewrite
tryb pozwala nam załadować «błąd Strona» bez przekierowanie przeglądarki, więc pobytów URL takie same, a najważniejsze dla mnie informacje wyjątek nie jest stracone.źródło
UpdatePanel
s; strona błędu nie będzie już wyświetlana.OK, znalazłem ten post: http://msdn.microsoft.com/en-us/library/aa479319.aspx
z tym bardzo ilustracyjnym diagramem:
(źródło: microsoft.com )
w istocie, aby uzyskać szczegółowe informacje o wyjątkach, muszę je samodzielnie przechowywać w Global.asax, aby później móc je odzyskać na mojej niestandardowej stronie błędu.
wydaje się, że najlepszym sposobem jest wykonanie większości pracy w Global.asax, z niestandardowymi stronami błędów obsługującymi pomocne treści, a nie logikę.
źródło
Połączenie tego, co powiedzieli NailItDown i Victor. Preferowanym / najłatwiejszym sposobem jest użycie pliku Global.Asax do zapisania błędu, a następnie przekierowanie do niestandardowej strony błędu.
Global.asax :
Ponadto musisz skonfigurować swój web.config :
I na koniec zrób wszystko, co musisz, z wyjątkiem zapisanym na stronie błędu :
źródło
Application[]
jest to obiekt globalny. Teoretycznie możesz mieć sytuację wyścigu, w której druga strona nadpisuje błąd. Ponieważ jednakSession[]
nie zawsze jest dostępny w warunkach błędu, myślę, że jest to lepszy wybór.Spróbuj użyć czegoś podobnego
Server.Transfer("~/ErrorPage.aspx");
doApplication_Error()
metody global.asax.csNastępnie z poziomu
Page_Load()
ErrorPage.aspx.cs powinieneś być w stanie zrobić coś takiego:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
wydaje się, że wyjątek kręci się wokół.źródło
Server.Transfer
strona jest renderowana w połowie, kod HTML strony, na którą się przenosisz, jest po prostu łączony z tym, co zostało już wyrenderowane. Możesz więc skończyć z połową zepsutej strony, a następnie stroną błędu poniżej.Chociaż jest tutaj kilka dobrych odpowiedzi, muszę zwrócić uwagę, że wyświetlanie komunikatów o wyjątkach systemowych na stronach błędów (jak zakładam, jest tym, co chcesz zrobić) nie jest dobrą praktyką. Możesz nieumyślnie ujawnić szkodliwym użytkownikom rzeczy, których nie chcesz. Na przykład komunikaty o wyjątkach serwera Sql są bardzo szczegółowe i mogą podawać nazwę użytkownika, hasło i informacje o schemacie bazy danych, gdy wystąpi błąd. Informacje te nie powinny być wyświetlane użytkownikowi końcowemu.
źródło
Oto moje rozwiązanie ...
W Global.aspx:
W Oops.aspx:
źródło
Jedną z ważnych kwestii, której moim zdaniem wszystkim brakuje, jest scenariusz równoważenia obciążenia (farma internetowa). Ponieważ serwer, który wykonuje global.asax, może być inny niż serwer, który ma wykonać niestandardową stronę błędu, przechowywanie obiektu wyjątku w aplikacji nie jest niezawodne.
Nadal szukam niezawodnego rozwiązania tego problemu w konfiguracji farmy internetowej i / lub dobrego wyjaśnienia od MS, dlaczego po prostu nie możesz odebrać wyjątku za pomocą Server.GetLastError na niestandardowej stronie błędu, tak jak możesz w global.asax Application_Error.
PS Przechowywanie danych w kolekcji aplikacji bez ich uprzedniego zablokowania, a następnie odblokowania jest niebezpieczne.
źródło
Jest to związane z tymi 2 tematami poniżej, chcę uzyskać zarówno GetHtmlErrorMessage, jak i stronę Session on Error.
Sesja ma wartość null po ResponseRewrite
Dlaczego HttpContext.Session ma wartość null, gdy redirectMode = ResponseRewrite
Próbowałem i widziałem rozwiązanie, którego nie potrzebowałem
Server.Transfer() or Response.Redirect()
Po pierwsze: usuń ResponseRewrite w web.config
Web.config
Następnie Global.asax
Następnie errorHandler.aspx.cs
W celach informacyjnych
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
źródło
U mnie to zadziałało. w MVC 5
w
~\Global.asax
w
~\Controllers
UtwórzErrorController.cs
w
~\Models
UtwórzFunctionTools.cs
w
~\Views
Utwórz folderError
i~\Views\Error
UtwórzError.cshtml
Jeśli wpiszesz ten adres
localhost/Error
A jeśli wystąpi błąd
Jak może być zamiast wyświetlać błędy, zmienna „log” ma być przechowywana w bazie danych
źródło
Myślę, że masz tutaj kilka opcji.
możesz zapisać ostatni wyjątek w sesji i pobrać go ze swojej niestandardowej strony błędu; lub możesz po prostu przekierować do niestandardowej strony błędu w zdarzeniu Application_error. Jeśli wybierzesz tę drugą opcję, upewnij się, że korzystasz z metody Server.Transfer.
źródło