Reescrita de URL do IIS e roteamento de ASP.NET
por Ruslan Yakushev
Com o lançamento do Módulo de Reescrita de URL para IIS e a inclusão de ASP.NET roteamento para o .NET Framework 4, houve muitas perguntas de ASP.NET desenvolvedores sobre como esses dois recursos se relacionam entre si e quando você deve usar um ou outro. Este documento descreve as diferenças entre essas duas tecnologias e fornece diretrizes para desenvolvedores Web sobre quando usar a regravação de URL do IIS e quando usar ASP.NET roteamento.
Do ponto de vista de alto nível, parece que essas tecnologias fornecem funcionalidades muito semelhantes, ambas permitem que seus aplicativos Web tenham URLs amigáveis e amigáveis ao mecanismo de pesquisa. No entanto, há diferenças fundamentais entre essas duas tecnologias que são importantes para entender para tomar a decisão certa sobre o que usar para seu aplicativo Web. Para ajudá-lo a entender essas diferenças, primeiro explicaremos como a regravação da URL do IIS e ASP.NET o roteamento funcionam.
Reescrita da URL do IIS
A ideia básica da reescrita de URL não é um novo conceito. Ele foi introduzido no servidor Web Apache há cerca de uma década. Desde então, provou ser uma ferramenta muito útil para administradores de servidorEs Web e desenvolvedores Web. Muitos aplicativos populares hospedados no Apache agora dependem da reescrita de URL para habilitar o suporte para URLs "limpas".
O conceito de regravação de URL é simples. Quando um cliente envia uma solicitação ao servidor Web para uma URL específica, o módulo de reescrita de URL analisa a URL solicitada e a altera para uma URL diferente no mesmo servidor. O módulo de reescrita de URL é executado no início do pipeline de processamento de solicitações, modificando a URL solicitada antes que o servidor Web decida qual manipulador usar para processar a solicitação. O manipulador, que é escolhido com base na URL reescrita, processa a solicitação e gera uma resposta que é enviada de volta para o navegador da Web. O cliente solicitante nunca vê a URL reescrita; No que diz respeito ao cliente, ele recebeu uma resposta da URL original.
Em termos da arquitetura do IIS, esse processo é representado pelo seguinte diagrama:
O módulo Regravação de URL é um módulo de código nativo que se conecta ao pipeline de processamento de solicitações nos estágios solicitação de pré-início ou solicitação de início e, em seguida, avalia o caminho de URL solicitado usando um conjunto de regras de reescrita. Cada regra de reescrita analisa o caminho da URL e, se todas as condições de regra forem atendidas, altera o caminho original para um novo caminho. Depois que todas as regras tiverem sido avaliadas, o módulo Regravação de URL produzirá um caminho de URL final que é usado para a solicitação por meio do restante do processamento de pipeline do IIS. Isso significa que a seleção do manipulador no pipeline do IIS é feita com base na URL reescrita produzida pelo módulo Regravação de URL.
Roteamento do ASP.NET
ASP.NET roteamento é um mecanismo de expedição de solicitação que permite aos desenvolvedores associar uma determinada URL a um manipulador que pode processar solicitações feitas a essa URL. Essa associação é feita registrando as "rotas" que definem qual manipulador invocar para um caminho de URL específico. Quando uma solicitação é feita a um servidor Web ASP.NET o roteamento procura o caminho de URL solicitado na lista de rotas registradas. Se a rota for encontrada, o manipulador correspondente dessa rota será invocado para processar essa solicitação.
Em termos de arquitetura de IIS e ASP.NET, esse processo é representado pelo seguinte diagrama:
ASP.NET roteamento é implementado como um módulo de código gerenciado que se conecta ao pipeline de processamento de solicitações do IIS no estágio Resolver Cache (evento PostResolveRequestCache) e no estágio manipulador de mapa (evento PostMapRequestHandler). ASP.NET roteamento está configurado para ser executado para todas as solicitações feitas ao aplicativo Web.
Durante o evento PostResolveRequestCache, o módulo examina uma tabela de roteamento (uma coleção de objetos de rota) para uma rota que corresponde ao caminho de URL solicitado. Se uma correspondência for encontrada, o módulo obterá uma referência ao manipulador que corresponde a essa rota e salvará a referência como parte do contexto HTTP atual. Um manipulador pode ser qualquer objeto do .NET Framework que implemente a interface System.Web.IHttpHandler. Se nenhuma rota for encontrada, o módulo não fará nada e a URL será processada normalmente (normalmente, correspondendo-a a um arquivo em disco).
Durante o evento PostMapRequestHandler, o módulo verifica se o contexto HTTP contém informações sobre um manipulador. Se isso acontecer, ASP.NET roteamento usará as informações para definir a propriedade Handler do contexto HTTP atual. Isso garante que, durante o estágio Executar Manipulador, o IIS execute o manipulador selecionado pelo módulo de roteamento. Se essas informações não estiverem definidas, o módulo não fará nada e a URL será fornecida para permitir que o IIS faça uma seleção de manipulador.
Diferenças entre a reescrita da URL do IIS e o roteamento de ASP.NET
Com base na explicação acima, há as seguintes principais diferenças conceituais entre a reescrita da URL do IIS e o roteamento ASP.NET:
- A reescrita de URL é usada para manipular caminhos de URL antes que a solicitação seja tratada pelo servidor Web. O módulo de reescrita de URL não sabe qual manipulador eventualmente processará a URL reescrita. Além disso, o manipulador de solicitação real pode não saber que a URL foi reescrita.
- ASP.NET roteamento é usado para expedir uma solicitação para um manipulador com base no caminho de URL solicitado. Em oposição à reescrita de URL, o módulo de roteamento sabe sobre os manipuladores e seleciona o manipulador que deve gerar uma resposta para a URL solicitada. Você pode pensar em ASP.NET roteamento como um mecanismo avançado de mapeamento de manipulador.
Além dessas diferenças conceituais, há as seguintes diferenças funcionais entre a reescrita da URL do IIS e o roteamento ASP.NET:
- O módulo regravação de URL do IIS pode ser usado com qualquer tipo de aplicativo Web, que inclui arquivos ASP.NET, PHP, ASP e estáticos. ASP.NET roteamento só pode ser usado com aplicativos Web baseados no .NET Framework.
- O módulo regravação de URL do IIS funciona da mesma maneira, independentemente de o modo de pipeline do IIS integrado ou clássico ser usado para o pool de aplicativos. Para ASP.NET roteamento, é preferível usar o modo de pipeline integrado. ASP.NET roteamento pode funcionar no modo clássico, mas nesse caso, as URLs do aplicativo devem incluir extensões de nome de arquivo ou o aplicativo deve ser configurado para usar o mapeamento do manipulador "*" no IIS.
- O módulo Regravação de URL do IIS pode tomar decisões de reescrita com base em nomes de domínio, cabeçalhos HTTP e variáveis de servidor. Por padrão, ASP.NET roteamento funciona apenas com caminhos de URL e com o cabeçalho HTTP-método.
- Além de reescrever, o módulo Regravação de URL pode executar redirecionamento HTTP, emitir códigos de status personalizados e solicitações de anulação. ASP.NET roteamento não executa essas tarefas.
- O módulo Regravação de URL não é extensível em sua versão atual. ASP.NET roteamento é totalmente extensível e personalizável.
Qual opção você deve usar?
O que todas essas informações significam se você precisa escolher uma tecnologia para habilitar URLs limpas para seus aplicativos Web? Nesta seção, explicamos como fazer essa escolha.
Se o aplicativo Web for criado usando qualquer coisa, exceto ASP.NET, use o módulo regravação de URL do IIS. Caso contrário, as regras são:
- Se você estiver desenvolvendo um novo aplicativo Web ASP.NET que usa tecnologias MVC ASP.NET ou ASP.NET Dados Dinâmicos, use ASP.NET roteamento. Seu aplicativo se beneficiará do suporte nativo para URLs limpas, incluindo a geração de URLs limpas para os links em suas páginas da Web. Observe que ASP.NET roteamento ainda não dá suporte a aplicativos Web Forms padrão, embora haja planos para dar suporte a ele no futuro.
- Se você já tiver um aplicativo Web ASP.NET herdado e não quiser alterá-lo, use o módulo Regravação de URL. O módulo Regravação de URL permite converter URLs amigáveis do mecanismo de pesquisa em um formato que seu aplicativo usa atualmente. Além disso, ele permite criar regras de redirecionamento que podem ser usadas para redirecionar rastreadores do mecanismo de pesquisa para limpar URLs.
Na prática, no entanto, a escolha não precisa ser ou não. As tecnologias podem ser usadas em conjunto e podem se complementar. Nas seções a seguir, descrevemos alguns cenários em que você pode usar ASP.NET roteamento e reescrita de URL do IIS juntas.
Impondo URLs canônicas para seu aplicativo.
Você deve forçar o uso de http://www.mysite.com/home/about
vez de http://mysite.com/Home/About
. Quando um cliente Web solicita uma URL que não está em conformidade com o formato desejado, o cliente é redirecionado para uma URL canônica. Nesse cenário, você pode usar o módulo Regravação de URL para impor URLs canônicas e executar o redirecionamento e usar ASP.NET roteamento para selecionar um manipulador que processaria o caminho de URL solicitado.
O exemplo a seguir mostra uma regra de reescrita de URL que você pode usar para este cenário:
<rewrite>
<rules>
<rule name="Enforce canonical hostname" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" negate="true" pattern="^www\.mysite\.com$" />
</conditions>
<action type="Redirect" url="http://www.mysite.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
Servindo conteúdo estático de um site ou servidor diferente.
Seu aplicativo Web é implantado em vários servidores de modo que o conteúdo dinâmico da Web esteja localizado em um site ou servidor e todo o conteúdo estático esteja em um site ou servidor diferente. Você pode usar o módulo Regravação de URL junto com o módulo de Roteamento de Solicitação de Aplicativo do IIS para encaminhar todas as solicitações de arquivos estáticos para um servidor diferente, ao mesmo tempo em que atende a todas as solicitações de páginas da Web dinâmicas do servidor atual. Dessa forma, ASP.NET roteamento é usado apenas para conteúdo dinâmico da Web e não avalia nenhuma URL para conteúdo estático.
O exemplo a seguir mostra uma regra de reescrita de URL que você pode usar para este cenário:
<rewrite>
<rules>
<rule name="Forward to static file server">
<match url="^.+\.(?:jpg|bmp|gif)$" />
<action type="Rewrite" url="http://static_file_server/{R:0}" />
</rule>
</rules>
</rewrite>
Gerenciamento de conteúdo estático.
Quando seus arquivos ou pastas estáticos são movidos para um novo local, você ainda pode dar suporte a URLs antigas por motivos de compatibilidade com versões anteriores. Na verdade, talvez você não queira que os visitantes do site saibam que os arquivos ou pastas foram movidos. Nesse caso, você pode usar o módulo Regravação de URL para reescrever caminhos para arquivos estáticos, enquanto todas as URLs para o ASP.NET páginas da Web dinâmicas são tratadas pelo módulo de roteamento.
O exemplo a seguir mostra uma regra de reescrita de URL que você pode usar para este cenário:
<rewrite>
<rules>
<rule name="Rewrite to new folder">
<match url="^Images/(.+)$" />
<action type="Rewrite" url="NewImages/{R:1}" />
</rule>
</rules>
</rewrite>
Bloqueio de solicitação.
O módulo Regravação de URL pode ser usado para bloquear determinadas solicitações com base em vários critérios. Por exemplo, você pode impedir que determinados rastreadores de site acessem caminhos de URL específicos em seu site. Dessa forma, as solicitações proibidas nem chegarão ao roteador ASP.NET, reduzindo assim a carga em seu servidor Web.
O exemplo a seguir mostra uma regra de reescrita de URL que você pode usar para bloquear rastreadores de site indesejados. Observe que as solicitações são bloqueadas para um caminho de URL específico com base no cabeçalho HTTP do agente do usuário ou com base no endereço IP do cliente:
<rewrite>
<rules>
<rule name="Block SomeRobot" stopProcessing="true">
<match url="^folder1/folder2" />
<conditions logicalGrouping="MatchAny">
<add input="{USER_AGENT}" pattern="SomeRobot" />
<add input="{REMOTE_ADDR}" pattern="201\.45\.33\.[0-5]" />
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
Direções futuras
Embora a reescrita de URL do IIS e o roteamento ASP.NET tenham alguma sobreposição funcional, eles abordam cenários exclusivos para cada tecnologia. Por isso, essas duas tecnologias continuarão a existir e evoluirão como componentes independentes no IIS, com potencial para uma integração mais rigorosa entre elas. Por exemplo, ASP.NET roteamento pode aproveitar algumas das ferramentas avançadas fornecidas com o módulo Regravação de URL. O módulo Regravação de URL pode ser melhor integrado com ASP.NET em termos de fornecer extensibilidade para personalizar a lógica de regravação de URL.
Conclusão
A reescrita da URL do IIS ou o roteamento ASP.NET podem ser usados para implementar cenários de manipulação de URL para seu aplicativo Web. ASP.NET roteamento é uma solução otimizada para ASP.NET, portanto, pode ser preferível para desenvolvedores Web que projetam seus aplicativos ASP.NET desde o início e desejam ter uma estrutura de URL limpa. A reescrita da URL do IIS é um mecanismo genérico de manipulação de URL que aborda uma infinidade de cenários. Em particular, ele pode ser usado por desenvolvedores Web, bem como administradores de servidor Web/site para habilitar URLs limpas para aplicativos Web existentes sem modificar o código do aplicativo.