Compartilhar via


Criação de uma restrição de rota personalizada (VB)

por Stephen Walther

Stephen Walther demonstra como você pode criar uma restrição de rota personalizada. Implementamos uma restrição personalizada simples que impede que uma rota seja correspondida quando uma solicitação de navegador é feita de um computador remoto.

O objetivo deste tutorial é demonstrar como você pode criar uma restrição de rota personalizada. Uma restrição de rota personalizada permite impedir que uma rota seja correspondida, a menos que alguma condição personalizada seja correspondida.

Neste tutorial, criamos uma restrição de rota Localhost. A restrição de rota Localhost corresponde apenas às solicitações feitas do computador local. As solicitações remotas de toda a Internet não são correspondentes.

Implemente uma restrição de rota personalizada implementando a interface IRouteConstraint. Essa é uma interface extremamente simples que descreve um único método:

Function Match ( _
    httpContext As HttpContextBase, _
    route As Route, _
    parameterName As String, _
    values As RouteValueDictionary, _
    routeDirection As RouteDirection _
) As Boolean

O método retorna um valor booliano. Se você retornar False, a rota associada à restrição não corresponderá à solicitação do navegador.

A restrição Localhost está contida na Listagem 1.

Listagem 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

A restrição na Listagem 1 aproveita a propriedade IsLocal exposta pela classe HttpRequest. Essa propriedade retorna true quando o endereço IP da solicitação é 127.0.0.1 ou quando o IP da solicitação é o mesmo que o endereço IP do servidor.

Você usa uma restrição personalizada dentro de uma rota definida no arquivo Global.asax. O arquivo Global.asax na Listagem 2 usa a restrição Localhost para impedir que qualquer pessoa solicite uma página de Administração, a menos que faça a solicitação do servidor local. Por exemplo, uma solicitação de /Administração/DeleteAll falhará quando feita de um servidor remoto.

Listagem 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

A restrição Localhost é usada na definição da rota Administração. Essa rota não será correspondida por uma solicitação remota do navegador. No entanto, observe que outras rotas definidas em Global.asax podem corresponder à mesma solicitação. É importante entender que uma restrição impede que uma rota específica corresponda a uma solicitação e nem todas as rotas definidas no arquivo Global.asax.

Observe que a rota Padrão foi comentada do arquivo Global.asax na Listagem 2. Se você incluir a rota Padrão, a rota Padrão corresponderá às solicitações do controlador de Administração. Nesse caso, os usuários remotos ainda podem invocar ações do controlador de Administração, mesmo que suas solicitações não correspondam à rota Administração.