Comment créer des contraintes d'itinéraire dans ASP.NET Core

Les contraintes de route dans ASP.NET Core sont utilisées pour filtrer ou empêcher les données indésirables d'atteindre les actions de votre contrôleur. Pour une introduction au routage dans ASP.NET Core, vous pouvez consulter mon article précédent sur le routage basé sur les attributs par rapport au routage basé sur les conventions dans ASP.NET Core. Cet article va au-delà des bases pour explorer les opérations avancées à l'aide de contraintes d'itinéraire.

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 dans Visual Studio 2019

Tout d'abord, créons un projet ASP.Net Core dans Visual Studio 2019. 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», spécifiez le nom et l'emplacement du nouveau projet.
  6. Cochez éventuellement la case «Placer la solution et le projet dans le même répertoire», en fonction de vos préférences.
  7. Cliquez sur Créer.
  8. Dans la fenêtre «Créer une nouvelle application Web ASP.NET Core» affichée ci-dessous, 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.
  9. Sélectionnez «Application Web (Model-View-Controller)» comme modèle de projet pour créer une nouvelle application ASP.NET Core MVC. 
  10. 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.
  11. Assurez-vous que l'authentification est définie sur «Aucune authentification» car nous n'utiliserons pas non plus l'authentification.
  12. Cliquez sur Créer.

En suivant ces étapes, vous créerez un nouveau projet ASP.NET Core MVC dans Visual Studio 2019. Nous utiliserons ce projet dans les sections ci-dessous pour illustrer comment nous pouvons utiliser les contraintes de routage dans ASP.NET Core 3.1.

La classe RouteCollection dans ASP.NET Core

La classe RouteTable dans ASP.NET Core contient une propriété nommée Routes qui stocke toutes les routes en tant que RouteCollection. La classe RouteCollection contient des méthodes d'extension qui peuvent être utilisées pour mapper des itinéraires ou les ignorer.

MapRoute est une méthode surchargée qui accepte les contraintes en tant que paramètre. Vous pouvez l'utiliser pour transmettre votre contrainte à l'itinéraire. Voici la déclaration de la méthode MapRoute.

Public static Route MapRoute (ces routes RouteCollection, nom de chaîne,

    chaîne url, valeurs par défaut de l'objet, contraintes d'objet);

L'interface IRouteConstraint dans ASP.NET Core

L'interface IRouteConstraint est un contrat qui contient la déclaration d'une seule méthode nommée Match. Cette interface doit être étendue par une classe et la méthode Match y est implémentée pour vérifier si un paramètre d'URL particulier est valide pour une contrainte. Voici comment l'interface IRouteConstraint est définie:

espace de noms Microsoft.AspNetCore.Routing

{

    interface publique IRouteConstraint

    {

        booléen Match (

            HttpContext httpContext,

            Route IRouter,

            chaîne routeKey,

            Valeurs RouteValueDictionary,

            RouteDirection routeDirection);

    }

}

Le dictionnaire ConstraintMap dans ASP.NET Core

Un ConstraintMap est un dictionnaire qui contient une liste de contraintes d'itinéraire qui mappe les clés de contrainte d'itinéraire aux implémentations d'IRouteConstraint. L'extrait de code ci-dessous illustre comment vous pouvez ajouter vos contraintes personnalisées à ce dictionnaire.

public void ConfigureServices (services IServiceCollection) 

{  

  services.Configurez (routeOptions =>  

  { 

     routeOptions.ConstraintMap.Add ("emailconstraint", typeof (EmailRouteContraint)); 

  }); 

Implémenter la méthode IRouteConstraint Match dans ASP.NET Core

Pour créer une contrainte de routage personnalisée, vous devez créer une classe qui étend l'interface IRouteConstraint et implémente sa méthode Match. La contrainte peut être utilisée pour contrecarrer les demandes entrantes non désirées et empêcher une route d'être mise en correspondance à moins qu'une condition particulière ne soit remplie. Par exemple, vous souhaiterez peut-être vous assurer que le paramètre passé à une méthode d'action est toujours un entier.

La méthode Match accepte les paramètres suivants:

  • HttpContext - encapsule toutes les informations spécifiques HTTP sur une requête
  • IRouter - représente le routeur qui appliquera les contraintes
  • RouteKey - représente le paramètre d'itinéraire qui est en cours de validation
  • RouteDirection - une énumération qui contient deux valeurs, à savoir IncomingRequest et UrlGeneration, et est utilisée pour indiquer si l'URL est traitée à partir de la requête HTTP ou générant une URL
  • RouteValues ​​- contient les paramètres d'URL

Structure d'une contrainte d'itinéraire personnalisée dans ASP.NET Core

Voici un exemple de la structure d'une contrainte d'itinéraire personnalisée:

classe publique CustomRouteConstraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, route IRouter,

        string routeKey, valeurs RouteValueDictionary,

        RouteDirection routeDirection)

        {

            throw new NotImplementedException ();

        }

    }

Exemple de contrainte de route personnalisée dans ASP.NET Core

Implémentons maintenant une contrainte d'itinéraire personnalisée qui peut vérifier les identifiants d'e-mail. Tout d'abord, créez une classe qui étend l'interface IRouteConstraint et implémente la méthode Match. L'extrait de code suivant montre une classe de contrainte d'itinéraire personnalisée nommée EmailRouteContraint qui étend l'interface IRouteConstraint.

public class EmailRouteContraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, route IRouter,

        string routeKey, valeurs RouteValueDictionary,

        RouteDirection routeDirection)

        {

            retourne vrai;

        }

    }

La liste de codes suivante montre la classe EmailRouteConstraint avec la méthode Match implémentée.

public class EmailRouteContraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, route IRouter,

        string routeKey, valeurs RouteValueDictionary,

        RouteDirection routeDirection)

        {

            if (values.TryGetValue (routeKey, out var routeValue))

            {

                var parameterValueString = Convert.ToString (routeValue,

                CultureInfo.InvariantCulture);

                return IsEmailAddressValid (parameterValueString);

            }

            retourner faux;

        }

        private bool IsEmailAddressValid (chaîne emailAddress)

        {

            retourne vrai;

        }

    }

Notez que la méthode IsEmailAddressValid renvoie simplement «true». Je vous laisse le soin d'écrire le code nécessaire pour valider l'adresse email.

Inscrire une contrainte de route personnalisée dans ASP.NET Core

Vous devez enregistrer votre contrainte de route personnalisée auprès du système de routage dans la méthode ConfigureServices de la classe Startup. L'extrait de code suivant illustre cela. 

public void ConfigureServices (services IServiceCollection)

      {

          services.AddControllersWithViews ();

          services.Configurez (routeOptions =>

          {

              routeOptions.ConstraintMap.Add ("ERC",

              typeof (EmailRouteContraint));

          });

      }

Vous devez également configurer votre contrainte de route personnalisée dans la méthode Configure de la classe Startup, comme indiqué dans l'extrait de code ci-dessous.

app.UseEndpoints (points de terminaison =>

{

     endpoints.MapControllerRoute (

         nom: "par défaut",

         contraintes: new {ERC = new EmailRouteContraint ()},

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

});

Et c'est tout. Vous pouvez maintenant spécifier la contrainte dans votre contrôleur ou vos méthodes d'action et commencer à utiliser l'application.

Le runtime ASP.NET Core vérifie si le modèle défini et les contraintes d'itinéraire correspondent au modèle et aux valeurs de la demande entrante. La logique de validation de la contrainte est définie dans la méthode Match de votre contrainte d'itinéraire personnalisée. Vous pouvez tirer parti des contraintes pour éviter les demandes inutiles ainsi que pour valider les valeurs d'itinéraire avant que la demande ne soit transmise à une méthode d'action.

Comment faire plus dans ASP.NET Core:

  • Comment gérer les secrets des utilisateurs dans ASP.NET Core
  • Comment créer des applications gRPC dans ASP.NET Core
  • Comment rediriger une demande dans ASP.NET Core
  • Comment utiliser le routage d'attributs dans ASP.NET Core
  • Comment passer des paramètres aux méthodes d'action dans ASP.NET Core MVC
  • Comment utiliser les analyseurs d'API dans ASP.NET Core
  • Comment utiliser les jetons de données de route dans ASP.NET Core
  • Comment utiliser la gestion des versions d'API dans ASP.NET Core
  • Comment utiliser des objets de transfert de données dans ASP.NET Core 3.1
  • Comment gérer les erreurs 404 dans ASP.NET Core MVC
  • 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