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.
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 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 NamePageEvent.aspx ein, und klicken Sie dann auf Öffnen.
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>
Klicken Sie im Menü Datei auf PageEvent.aspxspeichern.
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
:
Fügen Sie Ihrem Projekt eine neue Datei mit dem Namen AppEvent.aspx hinzu.
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>
Klicken Sie im Menü Datei auf AppEvent.aspxspeichern.
Fügen Sie das
Application_Error
Ereignis zur Datei Global.asax hinzu, um den Fehler abzufangen, denPage_Load
Sie im Falle der AppEvent.aspx Seite auslösen. Beachten Sie, dass Sie global.asax eineImports
Anweisung für denSystem.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
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 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.
Öffnen Sie die Datei Global.asax aus dem vorherigen Beispiel.
Kommentieren Sie die
Server.ClearError
Zeile aus, um sicherzustellen, dass der Fehler in der Web.config-Datei angezeigt wird.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
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.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>
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 angegebenendefaultRedirect
Seite um. Diesmode
wird hauptsächlich in der Produktion verwendet.Off
: Benutzer erhalten die Ausnahmeinformationen und werden nicht an diedefaultRedirect
Seite umgeleitet. Diesmode
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 diedefaultRedirect
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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für