web-dev-qa-db-de.com

Wie mache ich eine Catch All-Route, um Abfragen "404-Seite nicht gefunden" für ASP.NET MVC zu verarbeiten?

Ist es möglich, eine abschließende Route zu erstellen, die alle abfängt .. und den Benutzer zu einer 404-Ansicht in ASP.NET-MVC führt?

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

48
Pure.Krome

Ich habe die Antwort selbst gefunden.

Richard Dingwall hat einen exzellenten Beitrag, der verschiedene Strategien durchläuft. Mir gefällt besonders die FilterAttribute-Lösung. Ich bin kein Fan von Ausnahmen in der Umgebung, also werde ich sehen, ob ich das verbessern kann :)

Fügen Sie für global.asax diesen Code als Ihre letzte zu registrierende Route hinzu:

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

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 erhalten, indem ich einen ErrorController erstellt habe, der gibt die Ansichten in diesem Artikel zurück. Ich musste auch "Catch All" .__ hinzufügen. zur Route in global.asax. 

Ich kann nicht sehen, wie es zu einer dieser Fehlerseiten kommt, wenn es nicht .__ ist. in der Web.config ..? Meine Web.config musste angeben:

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

und dann habe ich noch hinzugefügt:

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>
19
smdrager

Sie können auch den NOT FOUND-Fehler in Global.asax.cs wie folgt behandeln 

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
    }
}
4
MSDs

Fügen Sie diese Zeilen unter Ihrem Projektstamm web.config File 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>

4
Vicky

Dies kann bei der Verwendung ein Problem sein

throw new HttpException(404);

Wenn Sie sich das einfangen möchten, weiß ich keine andere Möglichkeit, als Ihre Webkonfiguration zu bearbeiten.

3
Paco

Eine Alternative zum Erstellen einer Catch-All-Route ist das Hinzufügen einer Application_EndRequest-Methode zu Ihrer MvcApplication per Marcos Better-Than-Unicorns MVC 404-Antwort .

1
Edward Brey

Fügen Sie in RouterConfig.cs den folgenden Code hinzu:

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

           });
1
solanki dev

Wenn die Route nicht aufgelöst werden kann, gibt das MVC-Framework einen Fehler 404 aus..... Die beste Vorgehensweise ist die Verwendung von Ausnahmefiltern. 

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
0
Laxmeesh Joshi