446 Stimmen

Wie kann ich 404 in ASP.NET MVC ordnungsgemäß behandeln?

Ich benutze RC2

Die Verwendung von URL-Routing:

routes.MapRoute(
    "Error",
     "{*url}",
     new { controller = "Errors", action = "NotFound" }  // 404s
);

Das obige scheint Anfragen wie diese zu bearbeiten (unter der Annahme der Standard-Routen, die beim initialen MVC-Projekt eingerichtet wurden): "/blah/blah/blah/blah"

Überschreiben von HandleUnknownAction() im Controller selbst:

// 404s - hier behandeln (falsche Aktion angefordert
protected override void HandleUnknownAction(string actionName) {
    ViewData["actionName"] = actionName;
    View("NotFound").ExecuteResult(this.ControllerContext);
}  

Die bisherigen Strategien behandeln jedoch keine Anfrage an einen schlechten/ unbekannten Controller. Wenn ich zum Beispiel keinen "/IDoNotExist" habe, und diesen anfordere, erhalte ich die generische 404-Seite vom Webserver und nicht meine 404, wenn ich Routing + Überschreibung verwende.

Meine Frage lautet also: Gibt es eine Möglichkeit, diese Art von Anfrage innerhalb des MVC-Frameworks selbst mit einer Route oder ähnlichem abzufangen?

ODER sollte ich einfach standardmäßig die Web.Config customErrors als meinen 404-Handler verwenden und all dies vergessen? Ich nehme an, wenn ich customErrors verwende, werde ich die generische 404-Seite außerhalb von /Views speichern müssen, aufgrund der Einschränkungen von Web.Config bezüglich des direkten Zugriffs.

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.

1voto

Rob Lyndon Punkte 11339

Ich füge meine Lösung hinzu, die fast identisch mit der von Herman Kan ist, mit einer kleinen Änderung, um sie für mein Projekt zu ermöglichen.

Erstellen Sie einen benutzerdefinierten Fehlercontroller:

public class Error404Controller : BaseController
{
    [HttpGet]
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;
        return View("404");
    }
}

Erstellen Sie dann eine benutzerdefinierte Controller-Fabrik:

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return controllerType == null ? new Error404Controller() : base.GetControllerInstance(requestContext, controllerType);
    }
}

Fügen Sie schließlich eine Überschreibung zum benutzerdefinierten Fehlercontroller hinzu:

protected override void HandleUnknownAction(string actionName)
{
    var errorRoute = new RouteData();
    errorRoute.Values.Add("controller", "Error404");
    errorRoute.Values.Add("action", "PageNotFound");
    new Error404Controller().Execute(new RequestContext(HttpContext, errorRoute));
}

Und das ist es. Keine Notwendigkeit für Web.config-Änderungen.

1voto

Mehmet Punkte 711

1) Erstellen Sie eine abstrakte Controller-Klasse.

public abstract class MyController:Controller
{
    public ActionResult NotFound()
    {
        Response.StatusCode = 404;
        return View("NotFound");
    }

    protected override void HandleUnknownAction(string actionName)
    {
        this.ActionInvoker.InvokeAction(this.ControllerContext, "NotFound");
    }
    protected override void OnAuthorization(AuthorizationContext filterContext) { }
}  

2) Erben Sie von dieser abstrakten Klasse in allen Ihren Controllern

public class HomeController : MyController
{}  

3) Fügen Sie eine Ansicht mit dem Namen "NotFound" in Ihrem View-Shared-Ordner hinzu.

0voto

Parth Shah Punkte 1962

Ich habe die meisten der Lösungen durchgegangen, die in diesem Thread gepostet wurden. Auch wenn diese Frage vielleicht alt ist, ist sie auch jetzt noch sehr relevant für neue Projekte, also habe ich ziemlich viel Zeit damit verbracht, die hier präsentierten Antworten sowie anderswo zu lesen.

Wie @Marco darauf hingewiesen hat, unter welchen verschiedenen Fällen ein 404 auftreten kann, habe ich die von mir zusammengestellte Lösung mit dieser Liste abgeglichen. Zusätzlich zu seiner Liste von Anforderungen habe ich noch eine weitere hinzugefügt.

  • Die Lösung sollte MVC sowie AJAX/WebAPI-Aufrufe auf die angemessenste Weise behandeln können (d.h. wenn ein 404 in MVC auftritt, sollte die Seite „Nicht gefunden“ angezeigt werden und wenn ein 404 in WebAPI auftritt, sollte sie die XML-/JSON-Antwort nicht übernehmen, damit das verbrauchende Javascript diese leicht parsen kann).

Diese Lösung ist zweigeteilt:

Der erste Teil stammt von @Guillaume unter https://stackoverflow.com/a/27354140/2310818. Deren Lösung kümmert sich um alle 404-Fehler, die durch ungültige Route, ungültigen Controller und ungültige Aktion verursacht wurden.

Die Idee ist, ein WebForm zu erstellen und dann die NotFound-Aktion Ihres MVC-Fehlercontrollers aufrufen zu lassen. Dies alles ohne Umleitung, sodass Sie in Fiddler keine einzige 302 sehen werden. Die ursprüngliche URL bleibt ebenfalls erhalten, was diese Lösung fantastisch macht!


Der zweite Teil stammt von @Germán unter https://stackoverflow.com/a/5536676/2310818. Deren Lösung kümmert sich um alle 404, die von Ihren Aktionen in Form von HttpNotFoundResult() oder throw new HttpException() zurückgegeben wurden!

Die Idee ist, dass ein Filter die Antwort sowie die Ausnahme betrachtet, die von Ihren MVC-Controllern ausgelöst wurden, und die entsprechende Aktion in Ihrem Fehlercontroller aufruft. Auch diese Lösung funktioniert ohne Umleitung und die ursprüngliche URL bleibt erhalten!


Wie Sie sehen können, bieten beide Lösungen zusammen einen sehr robusten Fehlerbehandlungsmechanismus und erfüllen alle Anforderungen, die von @Marco sowie von mir aufgelistet wurden. Wenn Sie gerne eine funktionierende Beispiel oder eine Demo dieser Lösung sehen möchten, hinterlassen Sie bitte einen Kommentar, und ich würde mich freuen, diese für Sie zusammenzustellen.

0voto

Thakur Rock Punkte 475

Ich habe alle Artikel durchgegangen, aber nichts funktioniert für mich: Mein Anforderung ist, dass der Benutzer irgend etwas in Ihrer URL eingibt und die benutzerdefinierte 404-Seite angezeigt wird. Ich dachte, das sei sehr einfach. Aber Sie sollten verstehen, wie man mit dem 404 richtig umgeht:

Ich fand diesen Artikel sehr hilfreich. Sollte einmal gelesen werden.Benutzerdefinierte Fehlerseite - Ben Foster

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X