Wie mache ich einen Catch alle Route, um '404 -Seite nicht gefunden zu werden' Abfragen für ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/310580

Frage

Ist es möglich, eine endgültige Route zu erstellen, die alle fängt und den Benutzer zu einer 404 -Ansicht in ASP.NET MVC springt?

Hinweis: Ich möchte dies nicht in meinen IIS -Einstellungen einrichten.

War es hilfreich?

Lösung

Fand die Antwort selbst.

Richard Dingwall Hat einen hervorragenden Beitrag durch verschiedene Strategien. Besonders gefällt mir die Filterattribute -Lösung. Ich bin kein Fan von Ausnahmen um Willy Nilly, also werde ich sehen, ob ich das verbessern kann :)

Fügen Sie diesen Code für die global.asax einfach als letzte Route hinzu, um sich zu registrieren:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );

Andere Tipps

Diese Frage kam zuerst, aber die einfachere Antwort kam in einer späteren Frage:

Routing für benutzerdefinierte ASP.NET MVC 404 -Fehlerseite

Ich habe meine Fehlerbehandlung zum Laufen gebracht, indem ich einen Fehlercontroller erstellt habe, der die Ansichten in diesem Artikel zurückgibt. Ich musste auch die "Fang alle" zur Route in Global.asax hinzufügen.

Ich kann nicht sehen, wie es auf eine dieser Fehlerseiten kommt, wenn es nicht im Web.config ist. Mein Web.config musste angeben:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

Und dann fügte ich auch hinzu:

error statusCode="404" redirect="~/Error/NotFound"

Hoffe das hilft.

Ich liebe diesen Weg jetzt, weil es so einfach ist:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>

Sie können auch keinen Fehler in global.asax.cs wie unten bewältigen

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}

Fügen Sie diese Zeilen unter Ihre Projekt root web.config hinzu.

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

Dies kann ein Problem sein, wenn Sie verwenden

throw new HttpException(404);

Wenn Sie das fangen möchten, weiß ich keine andere Weise und bearbeite Ihre Webkonfiguration.

An alternative to creating a catch-all route is to add an Application_EndRequest method to your MvcApplication per Marco's Better-Than-Unicorns MVC 404 Answer.

Inside RouterConfig.cs add the follwing piece of code:

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });

If the route cannot be resolved, then MVC framework will through 404 error.. Best approach is to use Exception Filters ... Create a custom exceptionfilter and make like this..

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top