Freigeben über


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

In diesem Artikel wird beschrieben, wie Sie Microsoft Visual Basic .NET-Code zum Abfangen und Reagieren auf Fehler verwenden, wenn sie in ASP.NET auftreten.

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

Übersicht

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ömmlicher 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 Fehlerberichterstattungsseite zu erstellen. Diese Ansätze haben jedoch ihre Grenzen.

ASP.NET bietet mehrere Ebenen, auf denen Sie Fehler behandeln und beantworten 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 abfangen 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 direkt zu ASP.NET bereitgestellt werden, beschreibt dieser Artikel keine anderen Vorgehensweisen zur Fehlerbehandlung, z. B. den try-catch-finally Block und das ClR-Ausnahmesystem (Common Language Runtime).

Verwenden des Page_Error-Ereignisses

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

Notiz

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

In diesem Beispiel wird eine NULL-Ausnahme ausgelöst, wodurch ein Fehler im Page_Load Ereignis ausgelöst wird. 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 in 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 dem PageEvent.aspx den folgenden Code 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 "Speichern" PageEvent.aspx.

  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.

Notiz

Möglicherweise stellen Sie fest, dass der Code einen Aufruf ausgibt Server.ClearError. Dadurch wird verhindert, dass der Fehler weiter zum Application_Error Ereignis verarbeitet wird.

Verwenden des Application_Error-Ereignisses

Ähnlich wie bei dem 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 im Page_Error Ereignis abgefangen 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 werden soll, den Fehler im Application_Error Fall der Datei "Global.asax " abfangen und den Fehler in das Ereignisprotokoll schreiben. Die folgenden Schritte veranschaulichen die Verwendung des Application_Error Ereignisses:

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

  2. Fügen Sie dem 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 "Speichern" AppEvent.aspx.

  4. Fügen Sie das Application_Error Ereignis der Datei "Global.asax " hinzu, um den Fehler abzufangen, den Page_Load Sie im Falle der AppEvent.aspx-Seite auslösen. Beachten Sie, dass Sie eine Imports Anweisung für den System.Diagnostics Namespace zu Global.asax hinzufügen 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 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 weitere Aktionen ausführen.

Verwenden der Datei "Web.config"

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

Wenn ein Fehler auftritt, der nicht auf einer 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 Datei "Web.config " 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 die Fehler in der Datei "Web.config " angezeigt werden.

  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 <customErrors> Abschnitt den folgenden Code hinzu, um den Benutzer zu einer benutzerdefinierten Seite umzuleiten:

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

    Notiz

    Sie müssen den Dateipfad im defaultRedirect Attribut so ändern, dass er auf die relevanten Webserver- und 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 dem ErrorStatus.htm den folgenden Code 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. Um den Code zu testen, speichern Sie 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 ErrorStatus.htm Seite umgeleitet werden. Obwohl Sie auf eine Standardfehlerseite im Wert des defaultRedirect Attributs im <customErrors> Abschnitt verweisen können, können Sie auch eine bestimmte Seite angeben, auf die 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>
    

Notiz

Die im defaultRedirect <customErrors> Abschnitt angegebene Seite ist eine .htm Datei. Wenn Sie beabsichtigen, sie auf einer .aspx Seite (die und Page_Error Application_Error die Beispiele ausführen) zu verwendenGetLastError, müssen Sie die Ausnahme in einer Sitzungsvariable oder einem anderen Ansatz speichern, bevor die Umleitung stattfindet.

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

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

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

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

Problembehandlung

In der Standardinstallation unter Windows führt ASP.NET Webanwendungscode in einem Arbeitsprozess aus. Die Identität dieses Prozesses ist standardmäßig auf ein nicht privilegiertes lokales Konto namens ASPNET-Konto festgelegt. In Betaversionen von ASP.NET war 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 ist standardmäßig auf ein eingeschränktes Konto namens NetworkService festgelegt.

Weitere Informationen zu dieser Änderung und dazu, wie der Code in diesem Artikel ausgeführt werden kann, sowie anderer Code, der möglicherweise zusätzliche Zugriffsrechte benötigen, finden Sie unter Patterns & Practices

References