web-dev-qa-db-fra.com

Comment créer un itinéraire complet pour gérer les requêtes '404 pages non trouvées' pour ASP.NET MVC?

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

REMARQUE: je ne souhaite pas configurer ceci dans mes paramètres IIS.

48
Pure.Krome

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

Richard Dingwall a un excellent poste en passant par diverses stratégies. J'aime particulièrement la solution FilterAttribute. Je ne suis pas fan de jeter des exceptions autour de willy nilly, donc je verrai si je peux améliorer ça :)

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" }
    );
70
Pure.Krome

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

La gestion des erreurs a fonctionné en créant un ErrorController qui renvoie les vues dans cet article. Je devais aussi ajouter le "Catch All" à la route dans global.asax. 

Je ne vois pas comment cela aboutirait à l'une de ces pages d'erreur si ce n'est pas le cas dans le Web.config ..? Mon Web.config devait spécifier:

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

et puis j'ai aussi 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:

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

Aussi, vous pouvez 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
    }
}
4
MSDs

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

 <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

Cela peut être un problème lorsque vous utilisez

throw new HttpException(404);

Quand vous voulez comprendre cela, je ne connais pas d'autre moyen de modifier votre configuration Web.

3
Paco

Une alternative à la création d'un itinéraire fourre-tout consiste à ajouter une méthode Application_EndRequest à votre MvcApplication par La réponse MVC 404 Better-Than-Unicorns de Marco .

1
Edward Brey

Dans RouterConfig.cs, ajoutez le code suivant:

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

           });
1
solanki dev

Si la route ne peut pas être résolue, l'infrastructure MVC passera par l'erreur 404 .. La meilleure approche consiste à utiliser des filtres d'exception ... Créez un filtre d'exception personnalisé et procédez comme suit .. 

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