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