Comment faire un catch all route pour gérer les requêtes “404 page not found” pour ASP.NET MVC?

Est-il possible de créer un itinéraire final qui capte tout .. et renvoie l’utilisateur vers une vue 404 dans ASP.NET MVC?

REMARQUE: je ne veux pas configurer cela dans mes parameters IIS.

J’ai trouvé la réponse moi-même.

Richard Dingwall a un excellent post passant par diverses stratégies. J’aime particulièrement la solution FilterAtsortingbute. Je ne suis pas un fan de jeter des exceptions autour de bon gré mal gré, alors je vais voir si je peux améliorer cela 🙂

Pour le global.asax, ajoutez simplement ce code comme dernier itinéraire pour vous inscrire:

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

Cette question est venue en premier, mais la réponse la plus facile est venue dans une question ultérieure:

Routage pour la page d’erreur ASP.NET MVC 404 personnalisée

J’ai réussi à gérer mes erreurs en créant un ErrorController qui renvoie les vues dans cet article. J’ai également dû append le “Catch All” à la route dans global.asax.

Je ne peux pas voir comment il va arriver à l’une de ces pages d’erreur si ce n’est pas dans le Web.config ..? Mon Web.config devait spécifier:

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

et puis j’ai également ajouté:

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

J’espère que cela t’aides.

J’aime cette façon maintenant parce que c’est si simple:

     

Cela peut être un problème lorsque vous utilisez

 throw new HttpException(404); 

Lorsque vous voulez attraper ça, je ne connais pas d’autre moyen que de modifier votre configuration Web.

Ajoutez ces lignes sous le fichier web.config racine de votre projet.

            

Vous pouvez également gérer l’erreur NOT FOUND dans Global.asax.cs comme ci-dessous

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

Une alternative à la création d’une route fourre-tout consiste à append une méthode Application_EndRequest à votre application MvcApplication selon la réponse MVC 404 Better-Than-Unicorns de Marco .

Si la route ne peut pas être résolue, alors le framework MVC passera par l’erreur 404 .. La meilleure approche consiste à utiliser les filtres d’exception … Créez un filtre d’exception personnalisé et faites comme ceci ..

 public class RouteNotFoundAtsortingbute : FilterAtsortingbute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html"); } } 

Dans RouterConfig.cs ajoutez le morceau de code suivant:

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