Partilhar via


Criação de uma restrição de rota personalizada (C#)

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. Solicitações remotas de toda a Internet não são correspondentes.

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

bool Match(
    HttpContextBase httpContext,
    Route route,
    string parameterName,
    RouteValueDictionary values,
    RouteDirection routeDirection
)

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

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 um Administração página, a menos que faça a solicitação do servidor local. Por exemplo, uma solicitação para /Administração/DeleteAll falhará quando feita de um servidor remoto.

Listagem 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);
        }
    }
}

A restrição Localhost é usada na definição da rota Administração. Essa rota não será correspondida por uma solicitação de navegador remoto. 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 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.