Wie fange ich den http-Statuscode von Serverfehlern in einer allgemeinen benutzerdefinierten Fehleransicht in ASP.NET MVC ab?

Ich versuche, eine allgemeine benutzerdefinierte Fehlerseite in ASP.NET MVC 4 zu implementieren. Grundsätzlich habe ich ein Fehlerlayout eingerichtet, das einen Abschnitt für die Ausgabe des http-Statuscodes der Antwort definiert.

Die Ansicht, bei der meine Fehler auftreten sollen, übernimmt ein solches Layout und fügt einfach eine Nachricht hinzu, die aus dem Modell stammt, das beim Aufruf von View () in dem von mir festgelegten Controller (mit dem Namen "Error") instanziiert und übergeben wurde zur Behandlung benutzerdefinierter Fehler in der Datei web.config.

<customErrors defaultRedirect="/Error" mode="On"> 
</customErrors>

Der benutzerdefinierte Fehlercontroller:

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        return View(new CustomErrorViewModel(Response.Status));
    }
}

Die benutzerdefinierte Fehleransicht:

@{
    Layout = "~/Views/Shared/_CustomErrorLayout.cshtml";
}

@using System.Web.Configuration;
@using System.Configuration;
@using MVC_Tests.Models;
@model CustomErrorViewModel

@section HttpCode { @Response.StatusCode }

@Model.Status

Das Layout ist:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="~/Content/CustomError.css" rel="stylesheet" />
</head>
<body>
    <div id="divError">
        <h1>
            <span>Error &nbsp;</span>
            @RenderSection("HttpCode")
        </h1>
        <div id="divErrorMessage">
            <p>@RenderBody()</p>
        </div>
    </div>
</body>
</html>

Der Fehler, den ich zu behandeln versuche, ist eine einfache Division durch Null, die ich zur Aktion "Home-Index" hinzugefügt habe. Beachten Sie, dass ich ein @ möchsingle view, um verschiedene HTTP-Status-Fehlercodes des Servers (500er-Familie) zu verarbeiten.Ich weiß, dass eine andere Ansicht für jeden einzelnen http-Statuscode funktioniert. Ich bin nach einer einzigen Ansicht zum Behandeln mehrerer Codes.

Die benutzerdefinierte Fehlerbehandlung funktioniert, ich beende die gewünschte Ansicht - aber - wie oben erwähnt, habe ich erwartet, den http-Statuscode des Fehlers auszugeben. Stattdessen zeige ich immer 200 (OK) an, was nach meinem Verständnis und meinem Debugging geschieht, weil:

1. Erstens wird beim Stolpern mit der Division durch Null eine Ausnahme ausgelöst.

2. Jetzt findet eine Umleitung statt, da meine web.config-Anweisungen zur benutzerdefinierten Behandlung von Fehlern verwendet werden (da in der web.config kein spezifischer http-Statuscode angegeben wurde, behandle ich jeden http-Statusfehlercode in derselben Steuerung / Ansicht (" / Fehler "). Entscheidend ist hierbei, dass die Umleitung ein @ isNe Anfrage

3 Die Weiterleitung von Schritt 2 sendet mich an den Fehler-Controller und anschließend an dessen Ansicht, die gerendert wird.

4. Beim Rendern der Ansicht wird der http-Statuscode in den Abschnitt "Layoutdefiniert" eingefügt, meine benutzerdefinierte Nachricht wird hinzugefügt und die Ausgabe des http-Statuscode-Teils lautet wie gesagt: 200 (OK). Warum, wenn ein 500-Server-Fehler gewaltsam ausgelöst wurde? Wenn ich mich nicht irre, wird die Ansicht in einer anderen Anforderungs-Pipe gerendert, der Umleitungs-Pipe, und bei der Umleitung wird - es treten keine Fehler auf - eine Statusantwort von 200 (OK) ausgegeben.

Ich ging überDiepost von Dino Esposito zum Umgang mit Fehlern in asp.net mvc, aber ich möchte nicht allen Controllern der App Filter (OnException- und HandleError-Attributlösungen) hinzufügen (ich könnte einen neuen Basis-Controller mit einem solchen Filter erstellen und alle erstellen) die anderen erben davon, aber dazu müssen auch alle Controller-Klassen geändert werden. Der letzte Ansatz, den er erwähnt (Behandlung des Application_Error-Ereignisses von global.asax), dient nicht unbedingt diesem Zweck. Ich muss eine Umleitungsanweisung "Response.Redirect" im Handler ausgeben, die die Flexibilität übertrifft, die benutzerdefinierten Seiten festlegen zu können in der web.config (ich könnte immer noch zu einer in der web.config definierten Route umleiten, aber ich frage mich, ob dies für etwas, das so einfach aussieht, nicht zu umständlich wird).

Was ist der beste Weg, um den http-Statuscode einer Antwort für einen Serverfehler in meiner benutzerdefinierten Fehleransicht abzufangen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage