Der Umgang mit Fehlern in ASP.NET MVC ist einfach lästig. Ich habe eine Menge Vorschläge auf dieser Seite und auf anderen Fragen und Websites ausprobiert und nichts funktioniert gut. Ein Vorschlag war, Fehler in web.config innerhalb von system.webserver zu behandeln, aber das führt nur zu leeren Seiten.
Mein Ziel bei der Entwicklung dieser Lösung war es, folgendes zu erreichen:
- NICHT WEITERLEITEN
- KORREKTE STATUSCODES zurückgeben, nicht 200/OK wie die Standardfehlerbehandlung
Hier ist meine Lösung.
1. Fügen Sie folgendes im Abschnitt system.web hinzu
Das oben genannte behandelt alle URLs, die nicht von routes.config behandelt werden, und nicht behandelte Ausnahmen, insbesondere solche, die in den Ansichten auftreten. Beachten Sie, dass ich aspx und nicht html verwendet habe. Dies ermöglicht es mir, einen Antwortcode im Codebehind hinzuzufügen.
2. Erstellen Sie einen Ordner namens Error (oder wie auch immer Sie es bevorzugen) im Root Ihres Projekts und fügen Sie die beiden Webformulare hinzu. Hier ist meine 404-Seite;
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="404.aspx.cs" Inherits="Myapp.Error._404" %>
Seite nicht gefunden
" rel="stylesheet" />
404 - Seite nicht gefunden
Die gesuchte Seite konnte nicht gefunden werden.
Und im Codebehind setze ich den Antwortcode
protected void Page_Load(object sender, EventArgs e)
{
Response.StatusCode = 404;
}
Machen Sie dasselbe für die 500-Seite
3. Um Fehler innerhalb der Controller zu behandeln, gibt es viele Möglichkeiten. Das ist, was für mich funktioniert hat. Alle meine Controller erben von einem Basiskontroller. In diesem Basiskontroller habe ich die folgenden Methoden
protected ActionResult ShowNotFound()
{
return ShowNotFound("Seite nicht gefunden....");
}
protected ActionResult ShowNotFound(string message)
{
return ShowCustomError(HttpStatusCode.NotFound, message);
}
protected ActionResult ShowServerError()
{
return ShowServerError("Anwendungsfehler....");
}
protected ActionResult ShowServerError(string message)
{
return ShowCustomError(HttpStatusCode.InternalServerError, message);
}
protected ActionResult ShowNotAuthorized()
{
return ShowNotAuthorized("Sie sind nicht berechtigt ....");
}
protected ActionResult ShowNotAuthorized(string message)
{
return ShowCustomError(HttpStatusCode.Forbidden, message);
}
protected ActionResult ShowCustomError(HttpStatusCode statusCode, string message)
{
Response.StatusCode = (int)statusCode;
string title = "";
switch (statusCode)
{
case HttpStatusCode.NotFound:
title = "404 - Nicht gefunden";
break;
case HttpStatusCode.Forbidden:
title = "403 - Zugriff verweigert";
break;
default:
title = "500 - Anwendungsfehler";
break;
}
ViewBag.Title = title;
ViewBag.Message = message;
return View("CustomError");
}
4. Fügen Sie die CustomError.cshtml in Ihren Shared Ansichtenordner. Hier ist mein Beispiel;
@ViewBag.Title
@ViewBag.Message
Jetzt können Sie in Ihrem Anwendungscontroller etwas Ähnliches tun;
public class WidgetsController : ControllerBase
{
[HttpGet]
public ActionResult Edit(int id)
{
Versuchen
{
var widget = db.getWidgetById(id);
if(widget == null)
return ShowNotFound();
//oder return ShowNotFound("Ungültiges Widget!");
return View(widget);
}
fangen(Ausnahme ex)
{
//Fehler protokollieren
logger.Error(ex)
return ShowServerError();
}
}
}
Jetzt zum Hinweis. Es werden keine Fehler bei statischen Dateifehlern behandelt. Wenn Sie also eine Route wie example.com/widgets haben und der Benutzer sie in example.com/widgets.html ändert, erhalten sie die standardmäßige IIS-Fehlerseite, sodass Sie Fehler auf IIS-Ebene auf andere Weise behandeln müssen.
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.