Création d’une contrainte de route personnalisée (C#)
par Stephen Walther
Stephen Walther montre comment créer une contrainte d’itinéraire personnalisée. Nous implémentons une contrainte personnalisée simple qui empêche la mise en correspondance d’un itinéraire lorsqu’une requête de navigateur est effectuée à partir d’un ordinateur distant.
L’objectif de ce tutoriel est de montrer comment créer une contrainte d’itinéraire personnalisée. Une contrainte d’itinéraire personnalisé vous permet d’empêcher la mise en correspondance d’un itinéraire, sauf si une condition personnalisée est mise en correspondance.
Dans ce tutoriel, nous créons une contrainte d’itinéraire Localhost. La contrainte d’itinéraire Localhost correspond uniquement aux demandes effectuées à partir de l’ordinateur local. Les demandes distantes provenant d’Internet ne sont pas mises en correspondance.
Vous implémentez une contrainte d’itinéraire personnalisée en implémentant l’interface IRouteConstraint. Il s’agit d’une interface extrêmement simple qui décrit une méthode unique :
bool Match(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
La méthode retourne une valeur booléenne. Si vous retournez false, l’itinéraire associé à la contrainte ne correspond pas à la requête du navigateur.
La contrainte Localhost est contenue dans la liste 1.
Listing 1 - 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 dans listing 1 tire parti de la propriété IsLocal exposée par la classe HttpRequest. Cette propriété retourne true lorsque l’adresse IP de la demande est 127.0.0.1 ou lorsque l’adresse IP de la requête est identique à l’adresse IP du serveur.
Vous utilisez une contrainte personnalisée dans un itinéraire défini dans le fichier Global.asax. Le fichier Global.asax dans listing 2 utilise la contrainte Localhost pour empêcher quiconque de demander une page Administration, sauf s’il effectue la demande à partir du serveur local. Par exemple, une requête pour /Administration/DeleteAll échoue lorsqu’elle est effectuée à partir d’un serveur distant.
Listing 2 - Global.asax
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 l’itinéraire Administration. Cet itinéraire ne sera pas mis en correspondance par une demande de navigateur distant. Toutefois, réalisez que d’autres itinéraires définis dans Global.asax peuvent correspondre à la même requête. Il est important de comprendre qu’une contrainte empêche une route particulière de correspondre à une demande et non à toutes les routes définies dans le fichier Global.asax.
Notez que l’itinéraire par défaut a été commenté à partir du fichier Global.asax dans la liste 2. Si vous incluez l’itinéraire par défaut, l’itinéraire par défaut correspond aux demandes du contrôleur Administration. Dans ce cas, les utilisateurs distants peuvent toujours appeler des actions du contrôleur Administration même si leurs demandes ne correspondent pas à l’itinéraire Administration.