Tworzenie niestandardowych stron raportowania błędów w ASP.NET przy użyciu programu Visual Basic .NET
W tym artykule opisano sposób używania kodu .NET programu Microsoft Visual Basic do pułapki i reagowania na błędy, gdy wystąpią one 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 sposobie obsługi błędów i reagowania na nie. W tradycyjnej technologii ASP obsługiwane są błędy On Error Resume Next
(lub try-catch
bloki w języku JScript). Alternatywnie, jeśli używasz internetowych usług informacyjnych (IIS), użyj ASPError
obiektu do utworzenia niestandardowej strony 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ą pułapki 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. Mimo że w tym artykule opisano sposób dostarczania niestandardowych stron błędów i ogólnego raportowania błędów w związku bezpośrednio z 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 pułapkę błędów występujących na poziomie strony. Możesz wyświetlić informacje o błędzie (jak przykładowy kod do wykonania) lub zarejestrować zdarzenie lub wykonać inną akcję.
Uwaga 16.
W tym przykładzie są wyświetlane szczegółowe informacje o błędzie w przeglądarce tylko w celach demonstracyjnych. Podczas wyświetlania szczegółowych informacji użytkownikowi końcowemu aplikacji należy zachować ostrożność, szczególnie wtedy, gdy aplikacja jest uruchomiona w Internecie. Bardziej odpowiednią akcją byłoby wyświetlenie użytkownikowi komunikatu z powiadomieniem o tym, że wystąpił błąd, a następnie zarejestrowanie określonych szczegółów błędu w dzienniku zdarzeń.
W tym przykładzie jest zgłaszany wyjątek o wartości null, który wymusza wystąpienie błędu Page_Load
w zdarzeniu. Wykonaj następujące kroki, aby utworzyć stronę początkową, 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 polecenie Dodaj formularz internetowy.
- W polu tekstowym Nazwa wpisz PageEvent.aspx, a następnie kliknij przycisk Otwórz.
Dodaj następujący kod, aby 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ę Zapisz PageEvent.aspx.
Kliknij prawym przyciskiem myszy stronę, a następnie kliknij polecenie Wyświetl w przeglądarce, aby uruchomić stronę. Zwróć uwagę, że błąd jest zgłaszany i zgłaszany zgodnie ze specyfikacjami kodu.
Uwaga 16.
Możesz zauważyć, że kod wystawia wywołanie metody Server.ClearError
. Zapobiega to kontynuowaniu Application_Error
obsługi zdarzenia przez błąd.
Używanie zdarzenia Application_Error
Podobnie jak w Page_Error
przypadku zdarzenia, możesz użyć Application_Error
zdarzenia, aby wychwytować błędy występujące w aplikacji. Ze względu na zakres aplikacji w całym zdarzeniu 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 naśladowania jest oparty na powyższym Page_Error
przykładzie kodu zdarzenia i zostanie wyzwolony, jeśli błąd w Page_Load
zdarzeniu nie został uwięziony w Page_Error
zdarzeniu. Zdarzenie Application_Error
jest określone w pliku Global.asax aplikacji. Dla uproszczenia kroki opisane w tej sekcji tworzą nową stronę, na której ma zostać zgłoszony wyjątek, przechwytują błąd w Application_Error
przypadku pliku Global.asax i zapisują błąd w dzienniku zdarzeń. W poniższych krokach pokazano, jak używać Application_Error
zdarzenia:
Dodaj nowy plik o nazwie AppEvent.aspx do projektu.
Dodaj następujący kod, aby 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ę Zapisz AppEvent.aspx.
Application_Error
Dodaj zdarzenie do pliku Global.asax, aby wychwycić błąd zgłaszany wPage_Load
przypadku strony AppEvent.aspx. Zwróć uwagę, że musisz dodać instrukcjęImports
dlaSystem.Diagnostics
przestrzeni nazw do pliku Global.asax , aby użyć dziennika zdarzeń.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 polecenie 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łędu lub w razie potrzeby wykonać dodatkowe akcje.
Korzystanie z pliku Web.config
Jeśli błąd nie zostanie wywołany Server.ClearError
lub wychwytuje błąd w Page_Error
zdarzeniu, Application_Error
zostanie on obsłużony na podstawie ustawień w <customErrors>
sekcji pliku Web.config . <customErrors>
W sekcji można określić stronę przekierowania jako domyślną stronę błędu (defaultRedirect
) lub określić określoną stronę na podstawie wywoływanego kodu błędu protokołu HTTP (Hypertext Transfer Protocol). Za pomocą tej metody można dostosować komunikat o błędzie odbierany przez użytkownika.
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 aby Server.ClearError
nigdy nie był wywoływany. W związku z tym błąd jest obsługiwany w pliku Web.config jako ostatni punkt wychwytowania błędu.
Otwórz plik Global.asax z poprzedniego przykładu.
Oznacz jako komentarz wiersz, aby upewnić się
Server.ClearError
, że błędy są wyświetlane 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 16.
Należy zmodyfikować ścieżkę pliku w
defaultRedirect
atrybucie, aby odwoływać się do odpowiednich nazw serwerów sieci Web i aplikacji.Ponieważ błędy uwięzione na tym poziomie są wysyłane do domyślnej strony błędu, należy utworzyć stronę błędu o nazwie ErrorStatus.htm. Pamiętaj, że używasz tej metody do kontrolowania prezentowanych danych użytkownikowi, dlatego w tym przykładzie użyto strony .htm 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 . Mimo że można odwołać się do domyślnej strony błędu w wartości atrybutu
defaultRedirect
w<customErrors>
sekcji, można również określić określoną stronę do przekierowania na podstawie zgłoszonego kodu błędu HTTP. Element podrzędny<error>
umożliwia korzystanie z tej opcji. Na przykład:<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> <error statusCode="404" redirect="filenotfound.htm"/> </customErrors>
Uwaga 16.
Strona określona w defaultRedirect
<customErrors>
sekcji jest plikiem .htm . Jeśli zamierzasz użyć GetLastError
na stronie .aspx (którą Page_Error
robią i Application_Error
przykłady), musisz przechowywać wyjątek w zmiennej sesji lub inne podejście, zanim nastąpi przekierowanie.
Zwróć uwagę, że <customErrors>
sekcja zawiera mode
atrybut ustawiony na On
wartość . Atrybut mode
służy do kontrolowania sposobu wystąpienia przekierowania błędu. Jeśli na przykład tworzysz aplikację, najprawdopodobniej chcesz zobaczyć rzeczywiste komunikaty o błędach ASP.NET i nie chcesz przekierowywać do bardziej przyjaznej dla użytkownika strony błędu. Atrybut mode
zawiera następujące ustawienia:
On
: Nieobsługiwane wyjątki przekierowuje 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 rozwoju.RemoteOnly
: Tylko użytkownicy, którzy uzyskują dostęp do witryny na komputerze lokalnym (przy użyciu hosta lokalnego), otrzymują informacje o wyjątku. 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 systemu Windows ASP.NET uruchamia kod aplikacji internetowej w procesie roboczym. Tożsamość tego procesu jest domyślnie ustawiona na nieuprzywilejowane konto lokalne o nazwie konto ASPNET . W wersjach beta ASP.NET tożsamość procesu to System, zaawansowane konto administracyjne z wieloma uprawnieniami na maszynie.
W domyślnej instalacji w systemie Windows Server (IIS) ASP.NET uruchamia kod aplikacji internetowej w procesie roboczym. Tożsamość tego procesu jest domyślnie ustawiona na ograniczone konto o nazwie NetworkService.
Aby uzyskać więcej informacji na temat tej zmiany i sposobu jej wpływu na uruchomienie kodu w tym artykule, a także innego kodu, który może wymagać dodatkowych praw dostępu, zobacz wzorce i praktyki