Creazione di un vincolo di route personalizzato (VB)
Stephen Walther illustra come creare un vincolo di route personalizzato. Implementiamo un semplice vincolo personalizzato che impedisce la corrispondenza di una route quando viene effettuata una richiesta del browser da un computer remoto.
L'obiettivo di questa esercitazione è illustrare come creare un vincolo di route personalizzato. Un vincolo di route personalizzato consente di impedire la corrispondenza di una route a meno che non corrisponda a una condizione personalizzata.
In questa esercitazione viene creato un vincolo di route Localhost. Il vincolo di route Localhost corrisponde solo alle richieste effettuate dal computer locale. Le richieste remote da Internet non corrispondono.
Si implementa un vincolo di route personalizzato implementando l'interfaccia IRouteConstraint. Si tratta di un'interfaccia estremamente semplice che descrive un singolo metodo:
Function Match ( _
httpContext As HttpContextBase, _
route As Route, _
parameterName As String, _
values As RouteValueDictionary, _
routeDirection As RouteDirection _
) As Boolean
Il metodo restituisce un valore booleano. Se si restituisce False, la route associata al vincolo non corrisponde alla richiesta del browser.
Il vincolo Localhost è contenuto nell'elenco 1.
Elenco 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
Il vincolo in List 1 sfrutta la proprietà IsLocal esposta dalla classe HttpRequest. Questa proprietà restituisce true quando l'indirizzo IP della richiesta è 127.0.0.1 o quando l'INDIRIZZO IP della richiesta corrisponde all'indirizzo IP del server.
Si usa un vincolo personalizzato all'interno di una route definita nel file Global.asax. Il file Global.asax in List 2 usa il vincolo Localhost per impedire a chiunque di richiedere una pagina di Amministrazione a meno che non facciano la richiesta dal server locale. Ad esempio, una richiesta per /Amministrazione/DeleteAll avrà esito negativo quando viene eseguita da un server remoto.
Elenco 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
Il vincolo Localhost viene usato nella definizione della route Amministrazione. Questa route non verrà corrispondente a una richiesta del browser remoto. Tenere presente, tuttavia, che altre route definite in Global.asax potrebbero corrispondere alla stessa richiesta. È importante comprendere che un vincolo impedisce a una determinata route di corrispondere a una richiesta e non a tutte le route definite nel file Global.asax.
Si noti che la route predefinita è stata commentata dal file Global.asax nell'elenco 2. Se si include la route predefinita, la route predefinita corrisponderebbe alle richieste per il controller di Amministrazione. In tal caso, gli utenti remoti potrebbero comunque richiamare azioni del controller di Amministrazione anche se le richieste non corrispondono alla route Amministrazione.