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.
Führen Sie die folgenden Schritte aus, um ihrem Projekt eine neue Datei namens PageEvent.aspx hinzuzufügen:
- Öffnen Sie Visual Studio .NET.
- 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".
- Geben Sie im Textfeld "Name" PageEvent.aspx ein, und klicken Sie dann auf "Öffnen".
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>
Klicken Sie im Menü "Datei" auf "Speichern" PageEvent.aspx.
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:
Fügen Sie ihrem Projekt eine neue Datei mit dem Namen AppEvent.aspx hinzu.
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>
Klicken Sie im Menü "Datei" auf "Speichern" AppEvent.aspx.
Fügen Sie das
Application_Error
Ereignis der Datei "Global.asax " hinzu, um den Fehler abzufangen, denPage_Load
Sie im Falle der AppEvent.aspx-Seite auslösen. Beachten Sie, dass Sie eineImports
Anweisung für denSystem.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
Speichern Sie die Datei "Global.asax ".
Klicken Sie in Visual Studio .NET im Menü "Erstellen " auf " Erstellen".
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.
Öffnen Sie die Datei "Global.asax " aus dem vorherigen Beispiel.
Kommentieren Sie die
Server.ClearError
Zeile aus, um sicherzustellen, dass die Fehler in der Datei "Web.config " angezeigt werden.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
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.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>
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 angegebenedefaultRedirect
Seite weiter. Diesmode
wird hauptsächlich in der Produktion verwendet.Off
: Benutzer erhalten die Ausnahmeinformationen und werden nicht an diedefaultRedirect
Seite weitergeleitet. Diesmode
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 diedefaultRedirect
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