Création d’une contrainte de route personnalisée (VB)
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 :
Function Match ( _
httpContext As HttpContextBase, _
route As Route, _
parameterName As String, _
values As RouteValueDictionary, _
routeDirection As RouteDirection _
) As Boolean
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.vb
Public Class LocalhostConstraint
Implements IRouteConstraint
Public Function Match( _
ByVal httpContext As HttpContextBase, _
ByVal route As Route, _
ByVal parameterName As String, _
ByVal values As RouteValueDictionary, _
ByVal routeDirection As RouteDirection _
) As Boolean Implements IRouteConstraint.Match
Return httpContext.Request.IsLocal
End Function
End Class
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
Public Class MvcApplication
Inherits System.Web.HttpApplication
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.MapRoute( _
"Admin", _
"Admin/{action}", _
New With {.controller = "Admin"}, _
New With {.isLocal = New LocalhostConstraint()} _
)
'routes.MapRoute( _
' "Default", _
' "{controller}/{action}/{id}", _
' New With {.controller = "Home", .action = "Index", .id = ""} _
')
End Sub
Sub Application_Start()
RegisterRoutes(RouteTable.Routes)
End Sub
End Class
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.