52 votes

Comment créer une route "catch all" pour gérer les requêtes "404 page not found" en ASP.NET MVC ?

Est-il possible de créer une route finale qui capture tous les et renvoie l'utilisateur vers une vue 404 en ASP.NET MVC ?

NOTE : Je ne veux pas configurer cela dans mes paramètres IIS.

0 votes

Voir ma réponse à la question " stackoverflow.com/questions/619895/ ".

79voto

Pure.Krome Points 28473

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

Richard Dingwall a un excellent post passant en revue diverses stratégies. J'aime particulièrement la solution FilterAttribute. Je ne suis pas un fan de l'envoi d'exceptions à tort et à travers, je vais donc voir si je peux améliorer cette solution :)

Pour le global.asax, il suffit d'ajouter ce code comme dernière route pour s'enregistrer :

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

7 votes

J'ai essayé, mais ça ne marche pas. J'ai placé la route sous ma route par défaut, mais j'obtiens toujours des erreurs 404.

0 votes

Pouvez-vous m'expliquer ce que je dois faire exactement ? Je suis très novice en matière de MVC.

0 votes

2 choses. a) ajoutez cette dernière route à votre liste de routes. b) créez un contrôleur (dans mon exemple, je l'ai appelé StaticContentController) avec une méthode Action (dans mon exemple, j'ai ajouté une méthode appelée PageNotFound(..)) ajoutez la logique de cette méthode pour afficher la page 404 non trouvée, View.

20voto

smdrager Points 3034

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 404 personnalisée d'ASP.NET MVC

J'ai réussi à faire fonctionner ma gestion des erreurs en créant un ErrorController qui renvoie les vues de cet article. J'ai également dû ajouter la fonction "Catch All" (attraper tout) à la route dans global.asax.

Je ne vois pas comment il peut arriver à l'une de ces pages d'erreur s'il ne l'est pas. 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 vous aidera.

J'aime cette méthode maintenant parce qu'elle est si simple :

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

0 votes

C'est ce que j'ai maintenant, mais j'essaie de le remplacer par une meilleure solution qui n'enverra pas d'abord une réponse 302 au client mais directement une 404. Changez le redirectMode en ResponseRewrite et vous verrez que cela ne fonctionne plus... :-(

2 votes

@LouisSomers Depuis cette réponse, j'ai constaté que le meilleur moyen est celui décrit dans cette question : stackoverflow.com/questions/1171035/ Je préfère ne pas rediriger l'utilisateur vers une autre URL, car cela est moins convivial (même moi, je trouve cela ennuyeux pendant le développement). Merci.

0 votes

Je reçois l'erreur Config Error: The configuration section 'customErrors' cannot be read because it is missing a section declaration .

7voto

MSDs Points 73

Vous pouvez également gérer l'erreur NOT FOUND dans Global.asax.cs comme suit

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

4voto

Vicky Points 495

Ajoutez ces lignes sous votre projet Root web.config File.

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

3voto

Paco Points 6156

Cela peut poser un problème lorsque vous utilisez

throw new HttpException(404);

Si vous voulez attraper ça, je ne connais pas d'autre moyen que de modifier votre configuration web.

0 votes

ActionFilters : utilisez-les pour attraper l'exception HttpException.

0 votes

Et si l'exception n'est pas déclenchée par une action du contrôleur ? Je lance une exception 404 dans ma fabrique de contrôleur.

0 votes

Je ne suis pas sûr alors - je ne joue pas avec les usines de contrôleurs. désolé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X