Schnelle Antwort / TL; DR
Für die faulen Leute da draußen:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Entfernen Sie dann diese Zeile aus global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Dies gilt nur für IIS7 + und IIS Express.
Wenn Sie Cassini benutzen ... na ja ... ähm ... umständlich ...
Lange, erklärte Antwort
Ich weiß, dass dies beantwortet wurde. Aber die Antwort ist WIRKLICH EINFACH (Prost an David Fowler und Damian Edwards wirklich beantwortet haben).
Es ist nicht erforderlich, benutzerdefinierte Aktionen auszuführen .
Zum ASP.NET MVC3
alle Kleinigkeiten sind da.
Schritt 1 -> Aktualisieren Sie Ihre web.config an ZWEI Stellen.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
und
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
Beachten Sie nun sorgfältig die ROUTEN, für die ich mich entschieden habe. Sie können alles verwenden, aber meine Routen sind
/NotFound
<- für eine 404 nicht gefunden, Fehlerseite.
/ServerError
<- Fügen Sie für jeden anderen Fehler Fehler hinzu, die in meinem Code auftreten. Dies ist ein 500 Internal Server Error
Sehen Sie, wie der erste Abschnitt in <system.web>
nur einen benutzerdefinierten Eintrag enthält? Der statusCode="404"
Eintrag? Ich habe nur einen Statuscode aufgelistet, da alle anderen Fehler, einschließlich des 500 Server Error
(dh des lästigen Fehlers, der auftritt, wenn Ihr Code einen Fehler aufweist und die Benutzeranforderung abstürzt) .. alle anderen Fehler von der Einstellung behandelt werden defaultRedirect="/ServerError"
.. die besagt Wenn Sie keine 404-Seite nicht gefunden haben, gehen Sie bitte zur Route/ServerError
.
OK. das ist aus dem Weg .. jetzt zu meinen Routen in aufgeführtglobal.asax
Schritt 2 - Erstellen der Routen in Global.asax
Hier ist mein vollständiger Streckenabschnitt.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
Darin sind zwei Ignorierrouten aufgeführt -> axd's
und favicons
(ooo! Bonus-Ignorierroute für Sie!) Dann (und die Reihenfolge ist HIER IMPERATIV) habe ich meine zwei expliziten Fehlerbehandlungsrouten .. gefolgt von anderen Routen. In diesem Fall die Standardeinstellung. Natürlich habe ich mehr, aber das ist etwas Besonderes für meine Website. Stellen Sie einfach sicher, dass die Fehlerrouten ganz oben auf der Liste stehen. Ordnung ist unerlässlich .
Während wir uns in unserer global.asax
Datei befinden, registrieren wir das HandleError-Attribut NICHT global. Nein, nein, nein, Sir. Nadda. Nee. Nien. Negativ. Noooooooooo ...
Entfernen Sie diese Zeile von global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Schritt 3 - Erstellen Sie den Controller mit den Aktionsmethoden
Nun ... fügen wir einen Controller mit zwei Aktionsmethoden hinzu ...
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
Ok, lass uns das überprüfen. Erstens gibt es hier KEIN [HandleError]
Attribut. Warum? Weil das eingebaut istASP.NET
Framework bereits Fehler behandelt UND wir alle Dinge angegeben haben, die wir tun müssen, um einen Fehler zu behandeln :) Es ist in dieser Methode!
Als nächstes habe ich die beiden Aktionsmethoden. Da ist nichts Schwieriges. Wenn Sie Ausnahmeinformationen anzeigen möchten, können Server.GetLastError()
Sie diese Informationen abrufen.
Bonus WTF: Ja, ich habe eine dritte Aktionsmethode entwickelt, um die Fehlerbehandlung zu testen.
Schritt 4 - Erstellen Sie die Ansichten
Und schließlich erstellen Sie zwei Ansichten. Setzen Sie sie für diesen Controller in die normale Ansicht.
Bonuskommentare
- Du brauchst keine
Application_Error(object sender, EventArgs e)
- Die obigen Schritte funktionieren alle zu 100% perfekt mit Elmah . Elmah fraking wroxs!
Und das, meine Freunde, sollte es sein.
Herzlichen Glückwunsch zum Lesen und ein Einhorn als Preis!