Comment gérer les erreurs 404 dans ASP.NET Core MVC

ASP.NET Core MVC est l'équivalent .NET Core de l'infrastructure ASP.NET MVC pour la création d'applications Web et d'API multiplateformes, évolutives et hautes performances à l'aide du modèle de conception Model-View-Controller. Étonnamment, bien qu'ASP.NET Core offre de nombreuses options pour gérer correctement les erreurs 404, le runtime ASP.NET Core MVC n'en tire pas parti par défaut.

Par conséquent, lorsqu'une page Web est introuvable et qu'une erreur 404 est renvoyée par l'application, ASP.NET Core MVC présente uniquement une page d'erreur de navigateur générique (comme illustré dans la figure 1 ci-dessous). Cet article décrit trois options dans ASP.NET Core que nous pouvons utiliser pour gérer plus facilement les erreurs 404.

Pour utiliser les exemples de code fournis dans cet article, vous devez disposer de Visual Studio 2019 installé sur votre système. Si vous n'en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2019 ici.

Créer un projet ASP.NET Core MVC

Tout d'abord, créons un projet ASP.NET Core dans Visual Studio. En supposant que Visual Studio 2019 est installé sur votre système, suivez les étapes décrites ci-dessous pour créer un nouveau projet ASP.NET Core dans Visual Studio.

  1. Lancez l'IDE de Visual Studio.
  2. Cliquez sur "Créer un nouveau projet".
  3. Dans la fenêtre «Créer un nouveau projet», sélectionnez «Application Web ASP.NET Core» dans la liste des modèles affichés.
  4. Cliquez sur Suivant. 
  5. Dans la fenêtre «Configurer votre nouveau projet» ci-dessous, spécifiez le nom et l'emplacement du nouveau projet.
  6. Cliquez sur Créer.
  7. Dans la fenêtre «Créer une nouvelle application Web ASP.NET Core», sélectionnez .NET Core comme moteur d'exécution et ASP.NET Core 3.1 (ou version ultérieure) dans la liste déroulante en haut.
  8. Sélectionnez «Application Web (Model-View-Controller)» comme modèle de projet pour créer une nouvelle application ASP.NET Core MVC.
  9. Assurez-vous que les cases à cocher «Activer le support Docker» et «Configurer pour HTTPS» ne sont pas cochées car nous n'utiliserons pas ces fonctionnalités ici.
  10. Assurez-vous que l'authentification est définie sur «Aucune authentification» car nous n'utiliserons pas non plus l'authentification.
  11. Cliquez sur Créer.

Suivre ces étapes créera un nouveau projet ASP.NET Core MVC dans Visual Studio 2019. Nous utiliserons ce projet pour illustrer nos options de gestion des erreurs 404 dans les sections suivantes de cet article.

Lorsque vous exécutez le projet ASP.NET Core MVC que nous avons créé dans la section précédente, vous verrez la page d'accueil de l'application avec le message de bienvenue, comme illustré dans la figure 1 ci-dessous. 

Essayons maintenant de parcourir une page Web qui n'existe pas. Pour ce faire, tapez // localhost: 6440 / welcome dans la barre d'adresse de votre navigateur pendant l'exécution de l'application. Lorsque le moteur ASP.NET Core MVC ne parvient pas à localiser la ressource pour l'URL spécifiée, une erreur 404 est renvoyée et la page d'erreur suivante s'affiche. Ce n'est pas très élégant, n'est-ce pas?

Vérifier Response.StatusCode dans ASP.NET Core MVC

Il existe plusieurs façons d'améliorer cette page d'erreur générique. Une solution simple consiste à vérifier le code d'état HTTP 404 dans la réponse. S'il est trouvé, vous pouvez rediriger le contrôle vers une page qui existe. L'extrait de code suivant illustre comment vous pouvez écrire le code nécessaire dans la méthode Configure de la classe Startup pour rediriger vers la page d'accueil si une erreur 404 s'est produite.

 app.Use (async (contexte, suivant) =>

    {

        attendre suivant ();

        if (context.Response.StatusCode == 404)

        {

            context.Request.Path = "/ Accueil";

            attendre suivant ();

        }

    });

Maintenant, si vous exécutez l'application et essayez de parcourir l'URL // localhost: 6440 / welcome, vous serez redirigé vers la page d'accueil de l'application.

Le code complet de la méthode Configure est donné ci-dessous pour votre référence.

public void Configure (application IApplicationBuilder, IWebHostEnvironment env)

        {

            si (env.IsDevelopment ())

            {

                app.UseDeveloperExceptionPage ();

            }

            autre

            {

                app.UseExceptionHandler ("/ Home / Error");

            }

            app.Use (async (contexte, suivant) =>

            {

                attendre suivant ();

                if (context.Response.StatusCode == 404)

                {

                    context.Request.Path = "/ Accueil";

                    attendre suivant ();

                }

            });

            app.UseStaticFiles ();

            app.UseRouting ();

            app.UseAuthorization ();

            app.UseEndpoints (points de terminaison =>

            {

                endpoints.MapControllerRoute (

                    nom: "par défaut",

                    modèle: "{contrôleur = Accueil} / {action = Index} / {id?}");

            });

        }

Utiliser le middleware UseStatusCodePages dans ASP.NET Core MVC

Une deuxième solution pour gérer les erreurs 404 dans ASP.NET Core consiste à utiliser le middleware UseStatusCodePages intégré. L'extrait de code suivant montre comment vous pouvez implémenter StatusCodePages dans la méthode Configure de la classe Startup.

public void Configure (application IApplicationBuilder, IWebHostEnvironment env)

        {

            app.UseStatusCodePages ();

            // Autre code

        }

Désormais, lorsque vous exécutez l'application et accédez à la ressource inexistante, la sortie sera similaire à celle de la figure 3.

Utiliser le middleware UseStatusCodePagesWithReExecute dans ASP.NET Core MVC

Vous pouvez tirer parti du middleware UseStatusCodePagesWithReExecute pour gérer les codes de statut d'échec dans les cas où le processus de génération de la réponse n'a pas été démarré. Par conséquent, ce middleware ne gérera pas les erreurs de code d'état HTTP 404 - au lieu de cela, lorsqu'une erreur 404 se produit, le contrôle sera passé à une autre action du contrôleur pour gérer l'erreur.

L'extrait de code suivant illustre comment vous pouvez utiliser ce middleware pour rediriger vers une autre méthode d'action.

app.UseStatusCodePagesWithReExecute ("/ Home / HandleError / {0}");

Voici à quoi ressemblerait la méthode d'action.

[Route ("/ Home / HandleError / {code: int}")]

public IActionResult HandleError (code int)

{

   ViewData ["ErrorMessage"] = $ "Une erreur s'est produite. Le code d'erreur est: {code}";

   return View ("~ / Views / Shared / HandleError.cshtml");

}

Je vous laisse le soin de créer la vue HandleError pour afficher le message d'erreur.

Enfin, vous souhaiterez peut-être créer des vues spécifiquement pour un code d'erreur. Par exemple, vous pouvez créer des vues telles que Accueil / Erreur / 500.cshtml ou Accueil / Erreur / 404.cshtml. Vous pouvez ensuite vérifier le code d'erreur HTTP et rediriger vers la page d'erreur appropriée.

Une autre façon de gérer les erreurs de page non trouvées consiste à utiliser une vue personnalisée et à définir le code d'erreur de manière appropriée. Lorsqu'une erreur se produit dans votre application, vous pouvez rediriger l'utilisateur vers la page d'erreur appropriée et afficher votre message d'erreur personnalisé décrivant l'erreur.

Comment faire plus dans ASP.NET Core:

  • Comment utiliser l'injection de dépendances dans les filtres d'action dans ASP.NET Core 3.1
  • Comment utiliser le modèle d'options dans ASP.NET Core
  • Comment utiliser le routage de point de terminaison dans ASP.NET Core 3.0 MVC
  • Comment exporter des données vers Excel dans ASP.NET Core 3.0
  • Comment utiliser LoggerMessage dans ASP.NET Core 3.0
  • Comment envoyer des e-mails dans ASP.NET Core
  • Comment enregistrer des données sur SQL Server dans ASP.NET Core
  • Comment planifier des travaux à l'aide de Quartz.NET dans ASP.NET Core
  • Comment renvoyer des données à partir de l'API Web ASP.NET Core
  • Comment formater les données de réponse dans ASP.NET Core
  • Comment consommer une API Web ASP.NET Core à l'aide de RestSharp
  • Comment effectuer des opérations asynchrones à l'aide de Dapper
  • Comment utiliser les indicateurs de fonctionnalité dans ASP.NET Core
  • Comment utiliser l'attribut FromServices dans ASP.NET Core
  • Comment utiliser les cookies dans ASP.NET Core
  • Comment travailler avec des fichiers statiques dans ASP.NET Core
  • Comment utiliser le middleware de réécriture d'URL dans ASP.NET Core
  • Comment implémenter la limitation de débit dans ASP.NET Core
  • Comment utiliser Azure Application Insights dans ASP.NET Core
  • Utilisation des fonctionnalités NLog avancées dans ASP.NET Core
  • Comment gérer les erreurs dans l'API Web ASP.NET
  • Comment implémenter la gestion globale des exceptions dans ASP.NET Core MVC
  • Comment gérer les valeurs NULL dans ASP.NET Core MVC
  • Contrôle de version avancé dans l'API Web ASP.NET Core
  • Comment travailler avec les services de travail dans ASP.NET Core
  • Comment utiliser l'API de protection des données dans ASP.NET Core
  • Comment utiliser un middleware conditionnel dans ASP.NET Core
  • Comment travailler avec l'état de session dans ASP.NET Core
  • Comment écrire des contrôleurs efficaces dans ASP.NET Core