Schnelle Antwort / TL;DR
Für die faulen Leute da draußen:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Dann entfernen Sie diese Zeile aus global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Und dies gilt nur für IIS7+ und IIS Express.
Wenn Sie Cassini verwenden .. nun .. ähm .. peinlich ...
Lange, ausführliche Antwort
Ich weiß, dass dies beantwortet wurde. Aber die Antwort ist WIRKLICH EINFACH (Applaus für David Fowler und Damian Edwards für die wirklich gute Antwort).
Es ist nicht erforderlich, irgendetwas anzupassen.
Für ASP.NET MVC3
sind alle benötigten Teile vorhanden.
Schritt 1 -> Aktualisieren Sie Ihre web.config an ZWEI Stellen.
und
...
...
Beachten Sie jetzt genau die ROUTEN, die ich gewählt habe. Sie können alles verwenden, aber meine Routen sind
/NotFound
<- für eine 404 Seite nicht gefunden Fehlerseite.
/ServerError
<- für jeden anderen Fehler, einschließlich Fehler, die in meinem Code auftreten. dies ist ein 500 Interner Serverfehler
Sehen Sie, wie der erste Abschnitt in nur einen benutzerdefinierten Eintrag hat? Den statusCode="404"
Eintrag? Ich habe nur einen Statuscode aufgelistet, weil alle anderen Fehler, einschließlich des 500 Serverfehlers
(d.h. diese lästigen Fehler, die auftreten, wenn Ihr Code einen Fehler hat und die Anfrage des Benutzers abstürzt) .. alle anderen Fehler werden durch die Einstellung defaultRedirect="/ServerError"
behandelt .. was besagt, wenn es sich nicht um eine 404 Seite nicht gefunden handelt, gehen Sie bitte zur Route /ServerError
.
Ok. das wäre erledigt.. jetzt zu meinen Routen, die in global.asax
Schritt 2 - Erstellen der Routen in Global.asax
Hier ist mein vollständiger Routenabschnitt..
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Fehler - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Fehler - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Standard", // Routenname
"{controller}/{action}/{id}", // URL mit Parametern
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
Das listet zwei Auslassrouten -> axd
und favicons
(ooo! Bonus-Auslassroute für euch!) Dann (und die Reihenfolge ist HIER WICHTIG), habe ich meine beiden expliziten Fehlerbehandlungsrouten .. gefolgt von allen anderen Routen. In diesem Fall die Standardroute. Natürlich habe ich mehr, aber das ist speziell für meine Website. Stellen Sie einfach sicher, dass die Fehlerrouten oben auf der Liste stehen. Die Reihenfolge ist ausschlaggebend.
Zum Schluss, während wir in unserer global.asax
Datei sind, registrieren wir NICHT global das HandleError-Attribut. Nein, nein, nein Herr. Nadda. Nope. Nien. Negativ. Neiiiiiin...
Entfernen Sie diese Zeile aus global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Schritt 3 - Erstellen des Controllers 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: Übergeben Sie die Ausnahme dem ViewModel, das Sie erstellen können.
// Das ist eine Übung, liebe Leser, für -dich-.
// Falls Sie es dem View übergeben möchten, wenn Sie Admin sind, usw.
// if (User.IsAdmin) // <-- Das habe ich mir gerade ausgedacht :) Sie verstehen die Idee..
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Psst .. geheime Testmethode .. ooOoOoOooOOoooohhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
Ok, lasst uns das überprüfen. Zunächst einmal gibt es hier KEIN [HandleError]
Attribut. Warum? Weil das integrierte ASP.NET
-Framework bereits Fehler behandelt UND wir alle Schritte spezifiziert haben, die wir benötigen, um einen Fehler zu behandeln :) Es steckt in dieser Methode!
Dann habe ich die beiden Aktionsmethoden. Nichts Schwieriges dabei. Wenn Sie irgendwelche Ausnahmeinformationen anzeigen möchten, können Sie Server.GetLastError()
verwenden, um diese Informationen zu erhalten.
Bonus WTF: Ja, ich habe eine dritte Aktionsmethode erstellt, um die Fehlerbehandlung zu testen.
Schritt 4 - Erstellen der Ansichten
Und schließlich zwei Ansichten erstellen. Legen Sie sie an die normale Stelle für Ansichten dieses Controllers.
Bonuskommentare
- Sie benötigen 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, dass Sie so viel gelesen haben, und als Belohnung haben Sie einen Einhorn!
3 Stimmen
Es handelt sich um einen 404-Fehler, ich würde mich einfach nicht darum kümmern. Lassen Sie ihn 404 anzeigen, da der Benutzer definitiv etwas falsch eingegeben hat. Oder wenn es sich um etwas handelt, das verschoben wurde, sollte Ihre Anwendung diese Anfrage entgegennehmen und eine permanente Weiterleitung durchführen. 404 gehört zum Webserver, nicht zur Anwendung. Sie können immer IIS-Seiten für Fehler anpassen.
0 Stimmen
Sie können sich auch diese Lösung ansehen blog.dantup.com/2009/04/…
0 Stimmen
ben.onfabrik.com/posts/aspnet-mvc-custom-error-pages hat auch einige gute Informationen.
4 Stimmen
Es ist schade, dass 4 stabile Versionen später und nach mehr als 5 Jahren die Situation beim Umgang mit 404-Fehlern in asp.net MVC + IIS wirklich nicht verbessert hat und dies immer noch die go-to-Frage-und-Antwort-Seite ist, wie man damit umgeht.