Tworzenie niestandardowych stron raportowania błędów w ASP.NET przy użyciu platformy .NET w języku Visual Basic
W tym artykule opisano sposób używania kodu platformy .NET programu Microsoft Visual Basic do wychwytyowania błędów i reagowania na nie, gdy występują w ASP.NET.
Oryginalna wersja produktu: Visual Basic .NET, ASP.NET
Oryginalny numer KB: 308132
Podsumowanie
ASP.NET ulepszono opcje obsługi błędów z tradycyjnych aktywnych stron serwera (ASP). W ASP.NET można obsługiwać błędy na kilku różnych poziomach w aplikacjach.
Nowe funkcje w ASP.NET
ASP.NET oferuje kilka postępów w zakresie obsługi błędów i reagowania na nie. W tradycyjnym asp, można obsługiwać błędy z On Error Resume Next
(lub try-catch
bloków w języku JScript). Alternatywnie, jeśli używasz usług Internet Information Services (IIS), użyj obiektu ASPError
, aby utworzyć niestandardową stronę raportowania błędów. Jednak te podejścia mają swoje ograniczenia.
ASP.NET udostępnia kilka poziomów, na których można obsługiwać błędy, które mogą wystąpić podczas uruchamiania aplikacji ASP.NET i reagować na nie. ASP.NET udostępnia trzy główne metody, które umożliwiają nadlewki i reagowanie na błędy, gdy wystąpią: Page_Error
zdarzenie, Application_Error
zdarzenie i plik konfiguracji aplikacji (Web.config).
W tym artykule pokazano, jak używać tych nowych funkcji w aplikacji ASP.NET. Chociaż w tym artykule opisano sposób dostarczania niestandardowych stron błędów i ogólnego raportowania błędów, ponieważ odnosi się bezpośrednio do ASP.NET, w tym artykule nie opisano innych metod obsługi błędów, takich jak try-catch-finally
blok i system wyjątków środowiska Uruchomieniowego języka wspólnego (CLR).
Używanie zdarzenia Page_Error
Zdarzenie Page_Error
umożliwia wychwytowanie błędów występujących na poziomie strony. Możesz wyświetlić informacje o błędzie (tak jak przykładowy kod do wykonania) lub zarejestrować zdarzenie lub wykonać inną akcję.
Uwaga
W tym przykładzie są wyświetlane szczegółowe informacje o błędach w przeglądarce tylko w celach demonstracyjnych. Należy zachować ostrożność podczas wyświetlania szczegółowych informacji użytkownikowi końcowemu aplikacji, zwłaszcza gdy aplikacja jest uruchomiona w Internecie. Bardziej odpowiednią akcją byłoby wyświetlenie komunikatu użytkownikowi z powiadomieniem o wystąpieniu błędu, a następnie faktyczne rejestrowanie szczegółów określonego błędu w dzienniku zdarzeń.
Ten przykład zgłasza wyjątek o wartości null, który wymusza wystąpienie błędu w zdarzeniu Page_Load
. Wykonaj następujące kroki, aby utworzyć początkową stronę, która będzie testować Page_Error
zdarzenie.
Wykonaj następujące kroki, aby dodać nowy plik o nazwie PageEvent.aspx do projektu:
- Otwórz program Visual Studio .NET.
- W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu, wskaż polecenie Dodaj, a następnie kliknij pozycję Dodaj formularz internetowy.
- W polu tekstowym Nazwa wpisz PageEvent.aspx, a następnie kliknij przycisk Otwórz.
Dodaj następujący kod do PageEvent.aspx:
<%@ Page Language="vb"%> <script runat=server> Sub Page_Load(Sender as object, e as EventArgs) throw(new System.ArgumentNullException()) End Sub Sub Page_Error(Sender as object, e as EventArgs) Dim objErr as Exception = Server.GetLastError().GetBaseException() Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _ "<br><b>Error in: </b>" & Request.Url.ToString() & _ "<br><b>Error Message: </b>" & objErr.Message.ToString() & _ "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString() Response.Write(err.ToString()) Server.ClearError() End Sub </script>
W menu Plik kliknij pozycję ZapiszPageEvent.aspx.
Kliknij prawym przyciskiem myszy stronę, a następnie kliknij pozycję Wyświetl w przeglądarce, aby uruchomić stronę. Zwróć uwagę, że błąd jest zgłaszany i zgłaszany zgodnie ze specyfikacjami kodu.
Uwaga
Możesz zauważyć, że kod generuje wywołanie metody Server.ClearError
. Uniemożliwia to kontynuowanie obsługi błędu do Application_Error
zdarzenia.
Używanie zdarzenia Application_Error
Podobnie jak w przypadku Page_Error
zdarzenia, można użyć Application_Error
zdarzenia w celu wychwycenia błędów występujących w aplikacji. Ze względu na zakres całego zdarzenia można rejestrować informacje o błędach aplikacji lub obsługiwać inne błędy na poziomie aplikacji, które mogą wystąpić.
Przykład do wykonania jest oparty na poprzednim Page_Error
przykładzie kodu zdarzenia i zostałby wyzwolony, jeśli błąd w zdarzeniu Page_Load
nie został uwięziony w zdarzeniu Page_Error
. Zdarzenie Application_Error
jest określone w pliku Global.asax aplikacji. Dla uproszczenia kroki opisane w tej sekcji tworzą nową stronę, na której należy zgłosić wyjątek, wychwycić błąd w Application_Error
przypadku pliku Global.asax i zapisać błąd w dzienniku zdarzeń. Poniższe kroki pokazują, jak używać Application_Error
zdarzenia:
Dodaj nowy plik o nazwie AppEvent.aspx do projektu.
Dodaj następujący kod do AppEvent.aspx:
<script language=vb runat="server"> Sub Page_Load(Sender as object, e as EventArgs) throw(new ArgumentNullException()) End Sub </script>
W menu Plik kliknij pozycję ZapiszAppEvent.aspx.
Application_Error
Dodaj zdarzenie do pliku Global.asax, aby wychwycić błąd zgłaszany wPage_Load
przypadku strony AppEvent.aspx. Zwróć uwagę, że aby użyć dziennika zdarzeń, należy dodać instrukcjęImports
dlaSystem.Diagnostics
przestrzeni nazw do pliku Global.asax .Dodaj następujący kod do pliku Global.asax :
Imports System.Diagnostics Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim objErr As Exception = Server.GetLastError().GetBaseException() Dim err As String = "Error Caught in Application_Error event" & _ System.Environment.NewLine & _ "Error in: " & Request.Url.ToString() & _ System.Environment.NewLine & _ "Error Message: " & objErr.Message.ToString() & _ System.Environment.NewLine & _ "Stack Trace:" & objErr.StackTrace.ToString() EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error) Server.ClearError() additional actions... End Sub
Zapisz plik Global.asax .
W programie Visual Studio .NET w menu Kompilacja kliknij pozycję Kompiluj.
Kliknij prawym przyciskiem myszy stronę, a następnie kliknij pozycję Wyświetl w przeglądarce. W takim przypadku strona będzie pusta, jednak należy zauważyć, że nowy wpis został dodany w dzienniku zdarzeń. Ten przykład tworzy wpis w dzienniku aplikacji, który jest dostępny z Podgląd zdarzeń. Po zalogowaniu błędu możesz przekierować użytkownika do innej bardziej przyjaznej dla użytkownika strony błędów lub w razie potrzeby wykonać dodatkowe akcje.
Użyj pliku Web.config
Jeśli nie wywołasz lub nie wychwycisz Server.ClearError
błędu w zdarzeniu Page_Error
lub Application_Error
, błąd zostanie obsłużony na podstawie ustawień w <customErrors>
sekcji pliku Web.config . <customErrors>
W sekcji możesz określić stronę przekierowania jako domyślną stronę błędu (defaultRedirect
) lub określić określoną stronę na podstawie kodu błędu protokołu HTTP (Hypertext Transfer Protocol), który jest zgłaszany. Ta metoda umożliwia dostosowanie komunikatu o błędzie, który otrzymuje użytkownik.
Jeśli wystąpi błąd, który nie jest uwięziony na żadnym z poprzednich poziomów w aplikacji, zostanie wyświetlona ta strona niestandardowa. W tej sekcji pokazano, jak zmodyfikować plik Global.asax tak, Server.ClearError
aby nigdy nie był wywoływany. W związku z tym błąd jest obsługiwany w pliku Web.config jako ostatni punkt do wychwycenia błędu.
Otwórz plik Global.asax z poprzedniego przykładu.
Dodaj komentarz do wiersza
Server.ClearError
, aby upewnić się, że błąd zostanie wyświetlony w pliku Web.config .Zapisz zmiany w pliku Global.asax. Kod powinien teraz wyglądać podobnie do następującego:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim objErr As Exception = Server.GetLastError().GetBaseException() Dim err As String = "Error Caught in Application_Error event" & _ System.Environment.NewLine & _ "Error in: " & Request.Url.ToString() & _ System.Environment.NewLine & _ "Error Message: " & objErr.Message.ToString() & _ System.Environment.NewLine & _ "Stack Trace:" & objErr.StackTrace.ToString() EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error) Server.ClearError() additional actions... End Sub
Dodaj następujący kod do sekcji,
<customErrors>
aby przekierować użytkownika do strony niestandardowej:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
Uwaga
Należy zmodyfikować ścieżkę pliku w
defaultRedirect
atrybucie tak, aby odwoływała się do odpowiednich nazw serwerów sieci Web i aplikacji.Ponieważ błędy, które są uwięzione na tym poziomie, są wysyłane do domyślnej strony błędu, musisz utworzyć stronę błędu o nazwie ErrorStatus.htm. Należy pamiętać, że używasz tej metody do kontrolowania tego, co jest prezentowane użytkownikowi, dlatego w tym przykładzie użyto strony .htm dla strony błędu. Dodaj następujący kod do ErrorStatus.htm:
<HTML> <HEAD> <TITLE></TITLE> <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0"> </HEAD> <BODY> <b>Custom Error page!</b> <br> You have been redirected here from the <customErrors> section of the Web.config file. </BODY> </HTML>
Aby przetestować kod, zapisz pliki, skompiluj projekt, a następnie wyświetl AppEvent.aspx w przeglądarce. Zwróć uwagę, że po wystąpieniu błędu nastąpi przekierowanie do strony ErrorStatus.htm . Chociaż możesz odwołać się do domyślnej strony błędu w wartości
defaultRedirect
atrybutu<customErrors>
w sekcji, możesz również określić konkretną stronę do przekierowania na podstawie zgłoszonego kodu błędu HTTP. Element podrzędny<error>
zezwala na tę opcję. Przykład:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> <error statusCode="404" redirect="filenotfound.htm"/> </customErrors>
Uwaga
Strona określona w defaultRedirect
<customErrors>
sekcji jest plikiem .htm . Jeśli zamierzasz użyć GetLastError
na stronie .aspx (co Page_Error
robią przykłady i Application_Error
), musisz zapisać wyjątek w zmiennej sesji lub w innym podejściu, zanim nastąpi przekierowanie.
Zwróć uwagę, że <customErrors>
sekcja zawiera mode
atrybut ustawiony na On
. Atrybut mode
służy do kontrolowania sposobu przekierowywania błędów. Jeśli na przykład tworzysz aplikację, najprawdopodobniej chcesz wyświetlić rzeczywiste ASP.NET komunikaty o błędach i nie chcesz przekierowywać do bardziej przyjaznej dla użytkownika strony błędów. Atrybut mode
zawiera następujące ustawienia:
On
: Nieobsługiwane wyjątki przekierowują użytkownika do określonejdefaultRedirect
strony. Jest tomode
używane głównie w środowisku produkcyjnym.Off
: Użytkownicy otrzymują informacje o wyjątku i nie są przekierowywani dodefaultRedirect
strony. Jest tomode
używane głównie w programie.RemoteOnly
: Informacje o wyjątku otrzymują tylko użytkownicy uzyskujący dostęp do witryny na komputerze lokalnym (przy użyciu hosta lokalnego). Wszyscy inni użytkownicy są przekierowywani dodefaultRedirect
strony. Ten tryb jest używany głównie do debugowania.
Rozwiązywanie problemów
W domyślnej instalacji w systemie Windows ASP.NET uruchamia kod aplikacji internetowej w procesie roboczym. Tożsamość tego procesu jest domyślnie nieuprzywilejowanym kontem lokalnym nazywanym kontem ASPNET . W wersjach beta ASP.NET tożsamość procesu to System, zaawansowane konto administracyjne z wieloma uprawnieniami na komputerze.
W domyślnej instalacji w systemie Windows Server (IIS) ASP.NET uruchamia kod aplikacji internetowej w procesie roboczym. Tożsamość tego procesu domyślnie ma ograniczone konto o nazwie NetworkService.
Aby uzyskać więcej informacji na temat tej zmiany i jej wpływu na uruchamianie kodu w tym artykule, a także innych kodów, które mogą wymagać dodatkowych praw dostępu, zobacz wzorce & praktyk
Informacje
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla