Ich entwickle eine MVC3-Basiswebsite und suche nach einer Lösung für die Behandlung von Fehlern und das Rendern benutzerdefinierter Ansichten für jede Art von Fehler. Stellen Sie sich also vor, ich habe einen "Fehler" -Controller, dessen Hauptaktion "Index" (allgemeine Fehlerseite) ist, und dieser Controller verfügt über einige weitere Aktionen für die Fehler, die dem Benutzer möglicherweise wie "Handle500" oder "HandleActionNotFound" angezeigt werden.
Daher kann jeder Fehler, der auf der Website auftreten kann, von diesem "Fehler" -Controller behandelt werden (Beispiele: "Controller" oder "Aktion" nicht gefunden, 500, 404, dbException usw.).
Ich verwende die Sitemap-Datei, um Website-Pfade (und nicht Routen) zu definieren.
Diese Frage wurde bereits beantwortet, dies ist eine Antwort an Gweebz
Meine letzte applicaiton_error-Methode lautet wie folgt:
protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
try
{
var exception = Server.GetLastError();
Log.Logger.Error("unhandled exception: ", exception);
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
IController errorsController = new ErrorsController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
catch (Exception e)
{
//if Error controller failed for same reason, we will display static HTML error page
Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
Response.TransmitFile("~/error.html");
}
}
}
quelle
Antworten:
Hier ist ein Beispiel, wie ich mit benutzerdefinierten Fehlern umgehe. Ich definiere ein
ErrorsController
mit Aktionen, die verschiedene HTTP-Fehler behandeln:und dann abonniere ich den
Application_Error
inGlobal.asax
und rufe diesen Controller auf:quelle
Execute
ist eine in derIController
Schnittstelle definierte Methode . Dies kann unmöglich geschützt werden. Schauen Sie sich meinen Code genauer an:IController errorsController = new ErrorsController();
und beachten Sie den Typ dererrorsController
Variablen, für die ich dieExecute
Methode aufrufe . Es ist vom Typ,IController
also hindert Sie absolut nichts daran, diese Methode aufzurufen. ÜbrigensExecute
wurde auch in der Controller-Klasse in MVC 3 geschützt, so dass sich diesbezüglich nichts ändert.Response.ContentType = "text/html";
Weitere Artikel So erstellen Sie benutzerdefinierte Fehlerseiten mit MVC http://kitsula.com/Article/MVC-Custom-Error-Pages .
quelle
Sie können dies auch in der Datei Web.Config tun. Hier ist ein Beispiel, das in IIS 7.5 funktioniert.
quelle
Ich sehe, dass Sie einen Konfigurationswert für hinzugefügt haben
EnableCustomErrorPage
und Sie prüfen auchIsDebuggingEnabled
, ob Ihre Fehlerbehandlung ausgeführt werden soll oder nicht.Da es
<customErrors/>
in ASP.NET bereits eine Konfiguration gibt (die genau für diesen Zweck gedacht ist), ist es am einfachsten zu sagen:Dann würden Sie in die Konfiguration, die Sie
<customErrors mode="RemoteOnly" />
bereitstellen möchten, diese sicher bereitstellen, und wenn Sie Ihre benutzerdefinierte Fehlerseite testen müssen, würden Sie sie festlegen,<customErrors mode="On" />
damit Sie überprüfen können, ob sie funktioniert.Beachten Sie, dass Sie auch überprüfen müssen, ob
HttpContext.Current
null ist, da eine Ausnahme inApplication_Start
diese Methode weiterhin verwendet wird, obwohl kein aktiver Kontext vorhanden ist.quelle
Sie können eine benutzerfreundliche Fehlerseite mit dem richtigen http-Statuscode anzeigen, indem Sie das benutzerfreundliche Ausnahmebehandlungsmodul von Jeff Atwood mit einer geringfügigen Änderung des http-Statuscodes implementieren . Es funktioniert ohne Weiterleitungen. Obwohl der Code aus dem Jahr 2004 (!) Stammt, funktioniert er gut mit MVC. Es kann vollständig in Ihrer web.config konfiguriert werden, ohne dass sich der Quellcode des MVC-Projekts ändert.
Die Änderung, die erforderlich ist, um den ursprünglichen HTTP-Status anstelle eines
200
Status zurückzugeben, wird in diesem verwandten Forumsbeitrag beschrieben .Grundsätzlich können Sie in Handler.vb Folgendes hinzufügen:
quelle
Ich verwende MVC 4.5 und hatte Probleme mit Darins Lösung. Hinweis: Darins Lösung ist ausgezeichnet und ich habe sie verwendet, um meine Lösung zu finden. Hier ist meine modifizierte Lösung:
quelle