Ich habe eine benutzerdefinierte Fehlerseite für meine Anwendung eingerichtet:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
In Global.asax, Application_Error (), werden mit dem folgenden Code die Ausnahmedetails abgerufen:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
Wenn ich zu meiner Fehlerseite (~ / Errors / GeneralError.aspx.cs) komme, ist Server.GetLastError () null
Gibt es eine Möglichkeit, die Ausnahmedetails auf der Fehlerseite und nicht in Global.asax.cs abzurufen?
ASP.NET 3.5 unter Vista / IIS7
asp.net
exception
web-applications
custom-error-pages
Nailitdown
quelle
quelle
Antworten:
Bei genauerer Betrachtung meiner web.config-Einrichtung ist einer der Kommentare in diesem Beitrag sehr hilfreich
Wir können also
customErrors
diesen Parameter ändern :Der
ResponseRewrite
Modus ermöglicht es uns, die «Fehlerseite» zu laden, ohne den Browser umzuleiten, sodass die URL gleich bleibt und für mich wichtig ist, dass Ausnahmeinformationen nicht verloren gehen.quelle
UpdatePanel
s ausgelöst werden . Die Fehlerseite wird nicht mehr angezeigt.OK, ich habe diesen Beitrag gefunden: http://msdn.microsoft.com/en-us/library/aa479319.aspx
mit diesem sehr anschaulichen Diagramm:
(Quelle: microsoft.com )
Um diese Ausnahmedetails zu erhalten, muss ich sie im Wesentlichen selbst in Global.asax speichern, damit sie später auf meiner benutzerdefinierten Fehlerseite abgerufen werden können.
Es scheint der beste Weg zu sein, den Großteil der Arbeit in Global.asax zu erledigen, wobei die benutzerdefinierten Fehlerseiten eher hilfreiche Inhalte als Logik behandeln.
quelle
Eine Kombination aus dem, was NailItDown und Victor gesagt haben. Der bevorzugte / einfachste Weg besteht darin, den Fehler mit Global.Asax zu speichern und dann auf Ihre benutzerdefinierte Fehlerseite umzuleiten.
Global.asax :
Außerdem müssen Sie Ihre web.config einrichten :
Und schließlich tun Sie alles, was Sie brauchen, mit der Ausnahme, die Sie auf Ihrer Fehlerseite gespeichert haben :
quelle
Application[]
ein globales Objekt ist. Theoretisch könnte es zu einer Rennbedingung kommen, bei der eine zweite Seite den Fehler überschreibt. Da diesSession[]
jedoch unter Fehlerbedingungen nicht immer verfügbar ist, halte ich dies für die bessere Wahl.Versuchen Sie, etwas
Server.Transfer("~/ErrorPage.aspx");
aus derApplication_Error()
Methode von global.asax.cs zu verwendenDann
Page_Load()
sollten Sie innerhalb von ErrorPage.aspx.cs in Ordnung sein, um Folgendes zu tun:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
scheint die Ausnahme herumzuhängen.quelle
Server.Transfer
eine Seite zur Hälfte gerendert haben, wird der HTML-Code der Seite, auf die Sie übertragen, einfach mit dem verknüpft, was bereits gerendert wurde. Es kann also vorkommen, dass Sie eine halbe kaputte Seite haben, gefolgt von der Fehlerseite darunter.Obwohl es hier einige gute Antworten gibt, muss ich darauf hinweisen, dass es nicht empfehlenswert ist, Systemausnahmemeldungen auf Fehlerseiten anzuzeigen (was ich davon ausgehe, dass Sie dies tun möchten). Sie können böswilligen Benutzern versehentlich Dinge offenlegen, die Sie nicht möchten. Beispielsweise sind SQL Server-Ausnahmemeldungen sehr ausführlich und können den Benutzernamen, das Kennwort und die Schemainformationen der Datenbank angeben, wenn ein Fehler auftritt. Diese Informationen sollten einem Endbenutzer nicht angezeigt werden.
quelle
Hier ist meine Lösung ..
In Global.aspx:
In Oops.aspx:
quelle
Eine wichtige Überlegung, die meiner Meinung nach hier allen fehlt, ist ein Lastausgleichsszenario (Webfarm). Da sich der Server, auf dem global.asax ausgeführt wird, möglicherweise von dem Server unterscheidet, auf dem die benutzerdefinierte Fehlerseite ausgeführt wird, ist das Speichern des Ausnahmeobjekts in der Anwendung nicht zuverlässig.
Ich bin immer noch auf der Suche nach einer zuverlässigen Lösung für dieses Problem in einer Webfarmkonfiguration und / oder einer guten Erklärung von MS, warum Sie die Ausnahme mit Server.GetLastError auf der benutzerdefinierten Fehlerseite nicht wie möglich abrufen können in global.asax Application_Error.
PS Es ist nicht sicher, Daten in der Anwendungssammlung zu speichern, ohne sie zuerst zu sperren und dann zu entsperren.
quelle
Dies bezog sich auf diese beiden Themen unten. Ich möchte sowohl GetHtmlErrorMessage als auch Session on Error-Seite erhalten.
Die Sitzung ist nach ResponseRewrite null
Warum ist HttpContext.Session null, wenn redirectMode = ResponseRewrite
Ich habe versucht, eine Lösung zu finden, die nicht nötig ist
Server.Transfer() or Response.Redirect()
Erstens: Entfernen Sie ResponseRewrite in web.config
Web.config
Dann Global.asax
Dann errorHandler.aspx.cs
Für Referenzen
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
quelle
Es hat bei mir funktioniert. in MVC 5
im
~\Global.asax
in
~\Controllers
ErstellenErrorController.cs
in
~\Models
ErstellenFunctionTools.cs
in
~\Views
Ordner erstellenError
und in~\Views\Error
ErstellenError.cshtml
Wenn Sie diese Adresse eingeben
localhost/Error
Und wenn ein Fehler auftritt
Anstatt Fehler anzuzeigen, muss die Variable 'log' in der Datenbank gespeichert werden
quelle
Ich denke, Sie haben hier ein paar Möglichkeiten.
Sie können die letzte Ausnahme in der Sitzung speichern und von Ihrer benutzerdefinierten Fehlerseite abrufen. oder Sie können einfach innerhalb des Application_error-Ereignisses zu Ihrer benutzerdefinierten Fehlerseite umleiten. Wenn Sie sich für Letzteres entscheiden, möchten Sie sicherstellen, dass Sie die Server.Transfer-Methode verwenden.
quelle