Erstellen benutzerdefinierter Fehlerberichterstattungsseiten in ASP.NET mithilfe von Visual Basic .NET

In diesem Artikel wird beschrieben, wie Sie Microsoft Visual Basic .NET-Code verwenden, um Fehler abzufangen und darauf zu reagieren, wenn sie in ASP.NET auftreten.

Ursprüngliche Produktversion: Visual Basic .NET, ASP.NET
Ursprüngliche KB-Nummer: 308132

Zusammenfassung

ASP.NET hat die Fehlerbehandlungsoptionen von herkömmlichen Active Server Pages (ASP) verbessert. In ASP.NET können Sie Fehler auf verschiedenen Ebenen in Ihren Anwendungen behandeln.

Neue Features in ASP.NET

ASP.NET bietet verschiedene Fortschritte bei der Behandlung und Reaktion auf Fehler. In herkömmlichem ASP behandeln Sie Fehler mit On Error Resume Next (oder try-catch Blöcken in JScript). Wenn Sie Internetinformationsdienste (IIS) ausführen, verwenden Sie alternativ das ASPError -Objekt, um eine benutzerdefinierte Fehlerberichtsseite zu erstellen. Diese Ansätze haben jedoch ihre Grenzen.

ASP.NET bietet mehrere Ebenen, auf denen Sie Fehler behandeln und darauf reagieren können, die auftreten können, wenn Sie eine ASP.NET-Anwendung ausführen. ASP.NET bietet drei Standard Methoden, mit denen Sie Fehler abfangen und darauf reagieren können, wenn sie auftreten: das Page_Error Ereignis, das Application_Error Ereignis und die Anwendungskonfigurationsdatei (Web.config).

In diesem Artikel wird veranschaulicht, wie Sie diese neuen Features in Ihrer ASP.NET-Anwendung verwenden. Obwohl in diesem Artikel beschrieben wird, wie benutzerdefinierte Fehlerseiten und allgemeine Fehlerberichterstattung bereitgestellt werden, da sie sich direkt auf ASP.NET beziehen, werden in diesem Artikel keine anderen Fehlerbehandlungsansätze wie der try-catch-finally -Block und das CLR-Ausnahmesystem (Common Language Runtime) beschrieben.

Verwenden des Page_Error-Ereignisses

Das Page_Error -Ereignis bietet eine Möglichkeit, Fehler abzufangen, die auf Seitenebene auftreten. Sie können Fehlerinformationen anzeigen (wie im folgenden Beispielcode), oder Sie können das Ereignis protokollieren oder eine andere Aktion ausführen.

Hinweis

In diesem Beispiel werden detaillierte Fehlerinformationen im Browser nur zu Demonstrationszwecken angezeigt. Sie sollten vorsichtig sein, wenn Sie dem Endbenutzer detaillierte Informationen der Anwendung anzeigen, insbesondere wenn die Anwendung im Internet ausgeführt wird. Eine geeignetere Aktion besteht darin, dem Benutzer eine Meldung anzuzeigen, die diesen über einen Fehler informiert, und dann tatsächlich die spezifischen Fehlerdetails im Ereignisprotokoll zu protokollieren.

In diesem Beispiel wird eine NULL-Ausnahme ausgelöst, die einen Fehler im Page_Load -Ereignis erzwingt. Führen Sie die folgenden Schritte aus, um die erste Seite zu erstellen, auf der das Page_Error Ereignis getestet wird.

  1. Führen Sie die folgenden Schritte aus, um Ihrem Projekt eine neue Datei namens PageEvent.aspx hinzuzufügen:

    1. Öffnen Sie Visual Studio .NET.
    2. Klicken Sie Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Webformular hinzufügen.
    3. Geben Sie im Textfeld NamePageEvent.aspx ein, und klicken Sie dann auf Öffnen.
  2. Fügen Sie den folgenden Code zu PageEvent.aspx hinzu:

    <%@ 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. Klicken Sie im Menü Datei auf PageEvent.aspxspeichern.

  4. Klicken Sie mit der rechten Maustaste auf die Seite, und klicken Sie dann auf Im Browser anzeigen , um die Seite auszuführen. Beachten Sie, dass der Fehler ausgelöst und gemäß den Codespezifikationen gemeldet wird.

Hinweis

Möglicherweise stellen Sie fest, dass der Code einen Aufruf von ausgibt Server.ClearError. Dadurch wird verhindert, dass der Fehler mit dem Application_Error zu behandelnden Ereignis fortgesetzt wird.

Verwenden des Application_Error-Ereignisses

Ähnlich wie beim Page_Error -Ereignis können Sie das Application_Error -Ereignis verwenden, um Fehler abzufangen, die in Ihrer Anwendung auftreten. Aufgrund des anwendungsweiten Bereichs des Ereignisses können Sie Anwendungsfehlerinformationen protokollieren oder andere Fehler auf Anwendungsebene behandeln, die auftreten können.

Das folgende Beispiel basiert auf dem vorherigen Page_Error Ereigniscodebeispiel und würde ausgelöst, wenn der Fehler im Page_Load Ereignis nicht abgefangen Page_Error wurde. Das Application_Error Ereignis wird in der Global.asax-Datei Ihrer Anwendung angegeben. Der Einfachheit halber erstellen die Schritte in diesem Abschnitt eine neue Seite, auf der die Ausnahme ausgelöst, der Fehler im Fall der Application_Error Datei Global.asax abfangen und in das Ereignisprotokoll geschrieben wird. Die folgenden Schritte veranschaulichen die Verwendung des -Ereignisses Application_Error :

  1. Fügen Sie Ihrem Projekt eine neue Datei mit dem Namen AppEvent.aspx hinzu.

  2. Fügen Sie den folgenden Code zu AppEvent.aspx hinzu:

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. Klicken Sie im Menü Datei auf AppEvent.aspxspeichern.

  4. Fügen Sie das Application_Error Ereignis zur Datei Global.asax hinzu, um den Fehler abzufangen, den Page_Load Sie im Falle der AppEvent.aspx Seite auslösen. Beachten Sie, dass Sie global.asax eine Imports Anweisung für den System.Diagnostics Namespace hinzufügen müssen, um das Ereignisprotokoll verwenden zu können.

    Fügen Sie der Datei Global.asax den folgenden Code hinzu:

    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. Speichern Sie die Datei Global.asax .

  6. Klicken Sie in Visual Studio .NET im Menü Erstellen auf Erstellen.

  7. Klicken Sie mit der rechten Maustaste auf die Seite, und klicken Sie dann auf Im Browser anzeigen . In diesem Fall ist die Seite leer. Sie sollten jedoch feststellen, dass im Ereignisprotokoll ein neuer Eintrag hinzugefügt wurde. In diesem Beispiel wird ein Eintrag im Anwendungsprotokoll erstellt, auf das über die Ereignisanzeige zugegriffen werden kann. Nach der Protokollierung des Fehlers möchten Sie den Benutzer möglicherweise zu einer anderen benutzerfreundlicheren Fehlerseite umleiten oder bei Bedarf einige zusätzliche Aktionen ausführen.

Verwenden der Web.config-Datei

Wenn Sie den Fehler im Page_Error -Ereignis oder -Ereignis nicht aufrufen Server.ClearError oder Application_Error abfangen, wird der Fehler basierend auf den Einstellungen im <customErrors> Abschnitt der Web.config-Datei behandelt. <customErrors> Im Abschnitt können Sie eine Umleitungsseite als Standardfehlerseite (defaultRedirect) oder eine bestimmte Seite basierend auf dem ausgelösten HTTP-Fehlercode (Hypertext Transfer Protocol) angeben. Sie können diese Methode verwenden, um die Fehlermeldung anzupassen, die der Benutzer empfängt.

Wenn ein Fehler auftritt, der auf keiner der vorherigen Ebenen in Ihrer Anwendung abgefangen wird, wird diese benutzerdefinierte Seite angezeigt. In diesem Abschnitt wird veranschaulicht, wie die Datei Global.asax so geändert wird, dass Server.ClearError nie aufgerufen wird. Daher wird der Fehler in der Web.config Datei als letzter Punkt zum Abfangen des Fehlers behandelt.

  1. Öffnen Sie die Datei Global.asax aus dem vorherigen Beispiel.

  2. Kommentieren Sie die Server.ClearError Zeile aus, um sicherzustellen, dass der Fehler in der Web.config-Datei angezeigt wird.

  3. Speichern Sie Ihre Änderungen in Global.asax. Ihr Code sollte nun in etwa wie folgt aussehen:

     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. Fügen Sie dem Abschnitt den <customErrors> folgenden Code hinzu, um den Benutzer auf eine benutzerdefinierte Seite umzuleiten:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Hinweis

    Sie müssen den Dateipfad im defaultRedirect Attribut so ändern, dass er auf die relevanten Webserver- und Anwendungsnamen verweist.

  5. Da die Auffangfehler auf dieser Ebene an eine Standardfehlerseite gesendet werden, müssen Sie eine Fehlerseite mit dem Namen ErrorStatus.htmerstellen. Denken Sie daran, dass Sie diese Methode verwenden, um zu steuern, was dem Benutzer angezeigt wird. Daher wird in diesem Beispiel eine .htm Seite für die Fehlerseite verwendet. Fügen Sie den folgenden Code zum ErrorStatus.htmhinzu:

    <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. Speichern Sie zum Testen des Codes die Dateien, erstellen Sie das Projekt, und zeigen Sie dann AppEvent.aspx im Browser an. Beachten Sie, dass Sie beim Auslösen des Fehlers zur seiteErrorStatus.htm weitergeleitet werden. Sie können zwar im -Wert des defaultRedirect -Attributs im Abschnitt auf eine Standardfehlerseite verweisen, sie können aber auch eine bestimmte Seite angeben, an die <customErrors> eine Umleitung basierend auf dem ausgelösten HTTP-Fehlercode ausgeführt werden soll. Das <error> untergeordnete Element ermöglicht diese Option. Beispiel:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Hinweis

Die im defaultRedirect<customErrors> Abschnitt angegebene Seite ist eine .htm Datei. Wenn Sie beabsichtigen, in einer .aspx Seite zu verwenden GetLastError (was die Page_Error Beispiele und Application_Error tun), müssen Sie die Ausnahme in einer Sitzungsvariablen oder einem anderen Ansatz speichern, bevor die Umleitung erfolgt.

Beachten Sie, dass der <customErrors> Abschnitt ein mode -Attribut enthält, das auf On festgelegt ist. Das mode -Attribut wird verwendet, um zu steuern, wie die Fehlerumleitung auftritt. Wenn Sie beispielsweise die Anwendung entwickeln, möchten Sie höchstwahrscheinlich die tatsächlichen ASP.NET Fehlermeldungen anzeigen und nicht zur benutzerfreundlicheren Fehlerseite umgeleitet werden. Das mode Attribut enthält die folgenden Einstellungen:

  • On: Nicht behandelte Ausnahmen leiten den Benutzer zur angegebenen defaultRedirect Seite um. Dies mode wird hauptsächlich in der Produktion verwendet.

  • Off: Benutzer erhalten die Ausnahmeinformationen und werden nicht an die defaultRedirect Seite umgeleitet. Dies mode wird hauptsächlich in der Entwicklung verwendet.

  • RemoteOnly: Nur Benutzer, die auf den Standort auf dem lokalen Computer zugreifen (mithilfe von localhost), erhalten die Ausnahmeinformationen. Alle anderen Benutzer werden auf die defaultRedirect Seite umgeleitet. Dieser Modus wird hauptsächlich zum Debuggen verwendet.

Problembehandlung

In der Standardinstallation unter Windows führt ASP.NET Webanwendungscode in einem Arbeitsprozess aus. Die Identität dieses Prozesses wird standardmäßig auf ein nicht privilegiertes lokales Konto namens ASPNET-Konto festgelegt. In Betaversionen von ASP.NET lautete die Prozessidentität System, ein leistungsfähiges Administratorkonto mit vielen Berechtigungen auf dem Computer.

In der Standardinstallation unter Windows Server (IIS) führt ASP.NET Webanwendungscode in einem Arbeitsprozess aus. Die Identität dieses Prozesses wird standardmäßig auf ein eingeschränktes Konto namens NetworkService festgelegt.

Weitere Informationen zu dieser Änderung und wie sie sich auf die Ausführung des Codes in diesem Artikel auswirken kann, sowie anderen Code, der möglicherweise zusätzliche Zugriffsrechte benötigt, finden Sie unter Muster & Methoden.

References