Erstellen benutzerdefinierter Fehlerberichtsseiten 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 alternativ Internetinformationsdienste (IIS) ausführen, verwenden Sie das ASPError Objekt, um eine benutzerdefinierte Fehlerberichtsseite zu erstellen. Für diese Ansätze gelten jedoch einschränkungen.

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 Hauptmethoden, mit denen Sie Fehler beim Auftreten auffangen und darauf reagieren können: das Page_Error Ereignis, das Application_Error Ereignis und die Anwendungskonfigurationsdatei (Web.config).

In diesem Artikel wird die Verwendung dieser neuen Features in Ihrer ASP.NET-Anwendung veranschaulicht. Obwohl in diesem Artikel beschrieben wird, wie Benutzerdefinierte Fehlerseiten und allgemeine Fehlerberichte 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 Common Language Runtime (CLR)-Ausnahmesystem beschrieben.

Verwenden des Page_Error-Ereignisses

Das Page_Error Ereignis bietet eine Möglichkeit zum Auffangen von Fehlern, die auf Seitenebene auftreten. Sie können Fehlerinformationen anzeigen (wie der folgende Beispielcode), oder Sie können das Ereignis protokollieren oder eine andere Aktion ausführen.

Hinweis

In diesem Beispiel werden detaillierte Fehlerinformationen nur zu Demonstrationszwecken im Browser angezeigt. Sie sollten vorsichtig sein, wenn Sie detaillierte Informationen für den Endbenutzer der Anwendung anzeigen, insbesondere wenn die Anwendung im Internet ausgeführt wird. Eine geeignetere Aktion wäre das Anzeigen einer Meldung an den Benutzer, in der er benachrichtigt wird, dass ein Fehler aufgetreten ist, und dann die spezifischen Fehlerdetails im Ereignisprotokoll protokolliert werden.

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 Startseite zu erstellen, die das Page_Error Ereignis teste.

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

    1. Öffnen Sie Visual Studio .NET.
    2. Klicken Sie im 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 "Name" pageEvent.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.aspx speichern".

  4. Klicken Sie mit der rechten Maustaste auf die Seite, und klicken Sie dann im Browser auf "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 Server.ClearError ausgibt. Dadurch wird verhindert, dass der Fehler mit dem Application_Error zu behandelnden Ereignis fortsetzt.

Verwenden des Application_Error-Ereignisses

Ähnlich wie das Page_Error Ereignis können Sie das Ereignis verwenden, um Fehler Application_Error auffangen, 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 wird ausgelöst, wenn der Fehler im Page_Load Ereignis nicht im Ereignis abgefangen Page_Error wurde. Das Application_Error Ereignis wird in der Datei Global.asax Ihrer Anwendung angegeben. Der Einfachheit halber erstellen die Schritte in diesem Abschnitt eine neue Seite, auf der die Ausnahme ausgelöst, der Fehler im Application_Error Falle der Datei "Global.asax" auffangen und in das Ereignisprotokoll geschrieben wird. In den folgenden Schritten wird die Verwendung des Application_Error Ereignisses veranschaulicht:

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

  2. Fügen Sie AppEvent.aspx den folgenden Code 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.aspx speichern".

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

    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 im Browser auf "Anzeigen". In diesem Fall ist die Seite leer, Sie sollten jedoch feststellen, dass ein neuer Eintrag im Ereignisprotokoll hinzugefügt wurde. In diesem Beispiel wird ein Eintrag im Anwendungsprotokoll erstellt, auf das über die Ereignisanzeige zugegriffen werden kann. Nach dem Protokollieren 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 Ereignis nicht aufrufen Server.ClearError oder Page_Error auffangen, wird der Fehler basierend auf den Einstellungen im Abschnitt der Application_ErrorWeb.configDatei <customErrors> behandelt. In the <customErrors> section, you can specify a redirect page as a default error page ( defaultRedirect ) or specify to a particular page based on the Hypertext Transfer Protocol (HTTP) error code that is raised. Mit dieser Methode können Sie die Fehlermeldung anpassen, die der Benutzer erhält.

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 Sie die Datei Global.asax so ändern, dass Server.ClearError sie nie aufgerufen wird. Daher wird der Fehler in der Web.config Datei als letzter Punkt behandelt, um den Fehler abzufangen.

  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 ähnlich 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 folgenden Code <customErrors> hinzu, um den Benutzer zu einer benutzerdefinierten 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 den relevanten Webserver und die Anwendungsnamen verweist.

  5. Da die auf dieser Ebene abgefangenen Fehler an eine Standardfehlerseite gesendet werden, müssen Sie eine Fehlerseite mit dem Namen ErrorStatus.htm erstellen. 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 zu ErrorStatus.htm hinzu:

    <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 "AppEvent.aspx" im Browser an. Beachten Sie, dass Sie beim Auslösen des Fehlers zur ErrorStatus.htm Seite umgeleitet werden. Obwohl Sie im Wert des Attributs im Abschnitt auf eine Standardfehlerseite verweisen defaultRedirect <customErrors> können, können Sie auch eine bestimmte Seite angeben, zu der basierend auf dem ausgelösten HTTP-Fehlercode umgeleitet werden soll. Das <error> untergeordnete Element ermöglicht diese Option. Zum Beispiel:

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

Hinweis

Die im Abschnitt angegebene Seite defaultRedirect <customErrors> ist eine .htm Datei. Wenn Sie beabsichtigen, die GetLastError Ausnahme auf einer ASPX-Seite zu verwenden (was in den beispielen der Fall Page_Error Application_Error ist), müssen Sie die Ausnahme in einer Sitzungsvariablen oder in einem anderen Ansatz speichern, bevor die Umleitung erfolgt.

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

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

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

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

Problembehandlung

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

In der Standardinstallation auf 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 dazu, wie sie sich auf die Ausführung des Codes in diesem Artikel auswirken kann, sowie anderer Code, der möglicherweise zusätzliche Zugriffsrechte benötigt, finden Sie unter Muster & Methoden

References