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.

  1. Wykonaj następujące kroki, aby dodać nowy plik o nazwie PageEvent.aspx do projektu:

    1. Otwórz program Visual Studio .NET.
    2. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu, wskaż polecenie Dodaj, a następnie kliknij pozycję Dodaj formularz internetowy.
    3. W polu tekstowym Nazwa wpisz PageEvent.aspx, a następnie kliknij przycisk Otwórz.
  2. 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>
    
  3. W menu Plik kliknij pozycję ZapiszPageEvent.aspx.

  4. 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:

  1. Dodaj nowy plik o nazwie AppEvent.aspx do projektu.

  2. 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>
    
  3. W menu Plik kliknij pozycję ZapiszAppEvent.aspx.

  4. Application_Error Dodaj zdarzenie do pliku Global.asax, aby wychwycić błąd zgłaszany w Page_Load przypadku strony AppEvent.aspx. Zwróć uwagę, że aby użyć dziennika zdarzeń, należy dodać instrukcję Imports dla System.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
    
  5. Zapisz plik Global.asax .

  6. W programie Visual Studio .NET w menu Kompilacja kliknij pozycję Kompiluj.

  7. 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.

  1. Otwórz plik Global.asax z poprzedniego przykładu.

  2. Dodaj komentarz do wiersza Server.ClearError , aby upewnić się, że błąd zostanie wyświetlony w pliku Web.config .

  3. 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
    
  4. 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.

  5. 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>
    
  6. 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ślonej defaultRedirect strony. Jest to mode używane głównie w środowisku produkcyjnym.

  • Off: Użytkownicy otrzymują informacje o wyjątku i nie są przekierowywani do defaultRedirect strony. Jest to mode 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 do defaultRedirect 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