Ich möchte eine benutzerdefinierte Fehlerseite für 500, 404 und 403 anzeigen. Folgendes habe ich getan:
Benutzerdefinierte Fehler in der web.config wurden wie folgt aktiviert:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>
HandleErrorAttribute
Als globaler Aktionsfilter in derFilterConfig
Klasse wie folgt registriert :public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
Für jede der oben genannten Nachrichten wurde eine benutzerdefinierte Fehlerseite erstellt. Die Standardeinstellung für 500 war bereits sofort verfügbar.
In jeder benutzerdefinierten Fehlerseitenansicht wird angegeben, dass das Modell für die Seite ist
System.Web.Mvc.HandleErrorInfo
Für 500 wird die benutzerdefinierte Fehlerseite angezeigt. Für andere nicht.
Fehlt mir etwas?
Es sieht so aus, als ob dies nicht alles ist, um benutzerdefinierte Fehler anzuzeigen, während ich den Code in der OnException
Methode der HandleErrorAttribute
Klasse durchlese, und es werden nur 500 verarbeitet.
Was muss ich tun, um andere Fehler zu behandeln?
quelle
Antworten:
Mein aktuelles Setup (auf MVC3, aber ich denke, es gilt immer noch) basiert auf einem
ErrorController
, also benutze ich:Und der Controller enthält Folgendes:
Und die Ansichten genau so, wie Sie sie implementieren. Ich neige jedoch dazu, ein bisschen Logik hinzuzufügen, um die Stack-Trace- und Fehlerinformationen anzuzeigen, wenn sich die Anwendung im Debug-Modus befindet. Error.cshtml sieht also ungefähr so aus:
quelle
redirectMode="ResponseRewrite"
auf demCustomerErrors
Element hatte//you may want to set this to 200
im Code. TU DAS NICHT!Ich habe Pablo-Lösung gemacht und ich hatte immer den Fehler (MVC4)
Um dies zu beseitigen , entfernen Sie die Linie
in FilterConfig.cs
quelle
Ich mache etwas, das weniger Codierung erfordert als die anderen veröffentlichten Lösungen.
Erstens habe ich in meiner web.config Folgendes:
Der Controller (/Controllers/ErrorPageController.cs) enthält Folgendes:
Und schließlich enthält die Ansicht Folgendes (der Einfachheit halber abgespeckt, kann aber Folgendes enthalten:
So einfach ist das. Es könnte leicht erweitert werden, um detailliertere Fehlerinformationen anzubieten, aber ELMAH kümmert sich darum und der statusCode & statusDescription ist alles, was ich normalerweise brauche.
quelle
Hier scheinen einige Schritte durcheinander zu sein. Ich werde vorschlagen, was ich von Grund auf getan habe.
Erstellen Sie den
ErrorPage
ControllerFügen Sie Ansichten für diese beiden Aktionen hinzu (Rechtsklick -> Ansicht hinzufügen). Diese sollten in einem Ordner namens ErrorPage angezeigt werden.
Innerhalb
App_Start
öffnenFilterConfig.cs
und die Fehlerbehandlung Filter Kommentarzeile .Fügen Sie in web.config die folgenden
<customerErrors>
Einträge unter hinzuSystem.Web
Test (natürlich). Werfen Sie eine nicht behandelte Ausnahme in Ihren Code und sehen Sie, dass sie zur Seite mit der ID 500 wechselt. Verwenden Sie dann eine URL zu einer Seite, die nicht vorhanden ist, um 404 anzuzeigen.
quelle
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.
Alles, was ich von Ihrem Code aufgenommen habe, ist in der Datei web.config, die ich hinzugefügt habe,<error redirect = "~/ControllerName/ActionName" statusCode="404"/>
und es hat gut funktioniert :) Der Rest des Codes stammt aus der Antwort von @ Pablo. Ich verwende MVC 5 und Entity Framework 6. Ich habe nichtfilters.Add(new HandleErrorAttribute())
ausFilterConfig.cs
Ich würde empfehlen, die Datei Global.asax.cs zu verwenden.
quelle
Aufbauend auf der Antwort von maxspan habe ich auf GitHub ein minimales Beispielprojekt zusammengestellt, das alle Arbeitsteile zeigt.
Grundsätzlich fügen wir global.asax.cs nur eine
Application_Error
Methode hinzu , um die Ausnahme abzufangen und uns die Möglichkeit zu geben, eine Anforderung auf eine benutzerdefinierte Fehlerseite umzuleiten (oder genauer gesagt, die Anforderung zu übertragen ).Fehlerkontrolle:
Fehlerseitenansicht:
Es ist nichts anderes beteiligt, als das Deaktivieren / Entfernen
filters.Add(new HandleErrorAttribute())
in FilterConfig.csObwohl dies sehr einfach zu implementieren ist, besteht der einzige Nachteil, den ich bei diesem Ansatz sehe, darin, Querystring zu verwenden, um Ausnahmeinformationen an die Zielfehlerseite zu liefern.
quelle
Ich hatte alles eingerichtet, konnte aber auf unserem Staging-Server immer noch keine richtigen Fehlerseiten für den Statuscode 500 sehen, obwohl auf lokalen Entwicklungsservern alles einwandfrei funktionierte.
Ich habe diesen Blog-Beitrag von Rick Strahl gefunden, der mir geholfen hat.
Ich musste
Response.TrySkipIisCustomErrors = true;
meinen benutzerdefinierten Fehlerbehandlungscode ergänzen .quelle
Hier ist meine Lösung. Die Verwendung von [ExportModelStateToTempData] / [ImportModelStateFromTempData] ist meiner Meinung nach unangenehm.
~ / Views / Home / Error.cshtml:
~ / Controller / HomeController.sc:
~ / Controllers / BaseController.sc:
~ / Controller / MyController.sc:
Ich wünsche dir erfolgreiche Projekte ;-)
quelle
Sie können Fehler erhalten, die ordnungsgemäß funktionieren, ohne global.cs zu hacken, mit HandleErrorAttribute herumzuspielen, Response.TrySkipIisCustomErrors auszuführen, Application_Error anzuschließen oder was auch immer:
In system.web (nur das Übliche, ein / aus)
und in system.webServer
Jetzt sollten sich die Dinge wie erwartet verhalten, und Sie können Ihren ErrorController verwenden, um alles anzuzeigen, was Sie benötigen.
quelle
Es scheint, ich bin zu spät zur Party gekommen, aber du solltest dir das auch besser ansehen.
Also
system.web
für das Zwischenspeichern von Ausnahmen innerhalb der Anwendung wie return HttpNotFound ()und
system.webServer
um Fehler aufzuholen, die von IIS abgefangen wurden und nicht zum asp.net-Framework gelangtenWenn Sie sich im letzten Fall Gedanken über die Client-Antwort machen, ändern Sie die Datei
responseMode="Redirect"
inresponseMode="File"
und liefern Sie eine statische HTML-Datei, da auf dieser Seite eine benutzerfreundliche Seite mit einem 200-Antwortcode angezeigt wird.quelle
Fügen Sie dies in web.config unter dem Tag system.webserver wie folgt hinzu:
und fügen Sie einen Controller hinzu als,
und fügen Sie ihre respektierten Ansichten hinzu, dies wird definitiv funktionieren, denke ich für alle.
Diese Lösung habe ich gefunden aus: Neptune Century
quelle