Udostępnij za pośrednictwem


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.

  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 polecenie Dodaj formularz internetowy.
    3. W polu tekstowym Nazwa wpisz PageEvent.aspx, a następnie kliknij przycisk Otwórz.
  2. 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>
    
  3. W menu Plik kliknij pozycję Zapisz PageEvent.aspx.

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

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

  2. 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>
    
  3. W menu Plik kliknij pozycję Zapisz AppEvent.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 musisz dodać instrukcję Imports dla System.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
    
  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 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.

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

  2. Oznacz jako komentarz wiersz, aby upewnić się Server.ClearError , że błędy są wyświetlane 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 16.

    Należy zmodyfikować ścieżkę pliku w defaultRedirect atrybucie, aby odwoływać się do odpowiednich nazw serwerów sieci Web i aplikacji.

  5. 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>
    
  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 . 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ś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 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 do defaultRedirect 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

Informacje