Créer des contraintes de route personnalisées pour vos applications MVC

Louis-Guillaume MORAND

Stephen Walther démontre comment vous pouvez créer une contrainte de route personnalisée. Nous allons implémenter une simple contrainte de route personnalisée qui empêche une route d'être déclenchée lorsque la requête est faite depuis un ordinateur distant.

- Titre : Créer des contraintes de route personnalisées pour vos applications MVC

- Auteur : Louis-Guillaume MORAND

- Parution : 1 mai 2009

- Licence : Copyright ® 2009 Equipe dotnet. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Traduction

- Création d'une contrainte de route personnalisée

Traduction

Cet article est la traduction la plus fidèle possible de l'article original : Creating a Custom Route Constraint

Création d'une contrainte de route personnalisée

L'objectif de ce tutoriel est de démontrer comment vous pouvez créer une contrainte de route personnalisée. Une route personnalisée permet d'empêcher certaines routes d'être prises en compte à moins que certaines conditions soient respectées.

Dans ce tutoriel, nous allons créer une contrainte de route nommée Localhost. La contrainte de route ne correspondra qu'aux requêtes faites depuis l'ordinateur local. Les requêtes distantes faites à travers Internet ne seront pas prises en compte.

Vous implémentez une contrainte de route personnalisée en implémentant l'interface IRouteConstraint. C'est une interface extrêmement simple qui décrit une seule méthode :

bool Match( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection )

La méthode retourne une valeur booléenne. Si vous retournez faux, la route associée à la contrainte ne correspondra pas à la requête navigateur.

LocalhostConstraint.cs

using System.Web;
using System.Web.Routing;
namespace MvcApplication1.Constraints
{
public class LocalhostConstraint : IRouteConstraint
{
public bool Match ( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection )
{
return httpContext.Request.IsLocal;
}
}
}

La contrainte tire avantage de la propriété IsLocal exposée par la classe HttpRequest. Cette propriété retourne true lorsque l'adresse IP de la requête est soit 127.0.0.1 soit la même adresse que celle du serveur Web.

Vous utilisez une contrainte personnalisée dans une route définie dans le fichier Global.asax. Le fichier Global.asax utilise la contrainte Localhost pour empêcher n'importe qui de demander la page Admin à moins qu'ils fassent leur demande depuis le serveur local. Par exemple, la requête /Admin/DeleteAll échouera lorsque demandée depuis un serveur distant.

Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using MvcApplication1.Constraints;
namespace MvcApplication1
{
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( "Admin", "Admin/{action}", new {controller="Admin"}, new {isLocal=new LocalhostConstraint()} );
//routes.MapRoute(
// "Default",                                            // Route name
// "{controller}/{action}/{id}",                          // URL with parameters
// new { controller = "Home", action = "Index", id = "" } // Parameter defaults
//);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}

La contrainte Localhost est utilisée dans la définition de la route Admin. Cette route ne correspondra pas à une requête distante. Réalisez pourtant que d'autres routes définies dans le fichier Global.asax peuvent correspondre à cette même requête. Il est important de comprendre qu'une contrainte empêche une requête de correspondre à une route particulière, mais pas à toutes les routes définies dans le fichier Global.asax.

Notez que la route par défaut a été commentée dans le fichier Global.asax. Si vous incluez la route par défaut alors la route par défaut correspondra à la requête pour le contrôleur Admin. Dans ce cas particulier, les utilisateurs distants pourront toujours invoquer les actions du contrôleur Admin même si leurs requêtes ne correspondent pas à la route Admin.