domingo, 7 de junho de 2009

ASP.NET - C# - URLs com conteúdo indexável

Nesse post será tratado um tema que cada vez mais encontramos em aplicações Web que é referente a quantidade de informações que podemos disponibilizar nos endereços do Site, ou seja, incluir nas URLs informações relevantes do conteúdo da página ao invés das antigas variáveis com códigos.

Por exemplo ao acessar um produto de um Site geralmente encontrávamos algo como:

http://site.programandosolucoes.com/produto.aspx?codigo=1

Porém com a evolução das tecnologias e principalmente dos motores de pesquisa até mesmo a URL para acesso ao Site deve identificar o seu conteúdo para que sua indexação seja a melhor possível. Sendo assim, passamos a encontrar URLs como a seguinte:

http://site.programandosolucoes.com/produto/Marca-do-produto/nome-do-produto/Visualizar.aspx

Estamos falando em utilizar componentes que auxiliem a tratar URLs com informações e criar assim formas alternativas de acesso do que tínhamos até pouco tempo atrás. Isso é utilizado principalmente em blogs, sites de notícias e sites de vendas, por exemplo.

Para isso temos nas novas versões do ASP.NET a funcionalidade RewritePath do componente HttpContext que possibilita tratar a troca do endereço novo (com informações) para o antigo (com passagem de parâmetros) sem que o usuário final perceba isso. Sendo assim, visualmente a URL com informações do conteúdo sempre leva para a mesma página antiga (funcionam os 2 mecanismos).

Para o exemplo estaremos utilizando um Site de vendas de produtos que aceitará o nome do produto no endereço.

Uma das soluções é construirmos um novo módulo (realizando a interface IHttpModule) que irá receber a URL com as informações e irá traduzir para o formato que o sistema espera. Partindo sempre do pressuposto que as regras são definidas sobre valores únicos (descrições na URL são únicas) e apontam sempre para um mesmo conteúdo. Exemplo do código fonte utilizado:


   1:      public class UrlRewrite : IHttpModule

   2:      {

   3:          #region IHttpModule Members

   4:   

   5:          public void Dispose()

   6:          {

   7:              //

   8:          }

   9:   

  10:          public void Init(HttpApplication context)

  11:          {

  12:              context.BeginRequest += new EventHandler(context_BeginRequest);

  13:          }

  14:   

  15:          void context_BeginRequest(object sender, EventArgs e)

  16:          {

  17:              HttpContext context = ((HttpApplication)sender).Context;

  18:              string path = context.Request.Path.ToUpperInvariant();

  19:              string url = context.Request.RawUrl.ToUpperInvariant();

  20:   

  21:              if (url.Contains("/PRODUTO/"))

  22:              {

  23:                  string[] parameters = url.Substring(url.IndexOf("/PRODUTO/")+1).Split('/');

  24:                  string type = parameters[0];

  25:                  string product = parameters[1];

  26:                  string operation = parameters[2];

  27:   

  28:                  if (type.Equals("PRODUTO") && operation.Contains("VISUALIZAR"))

  29:                  {

  30:                      context.RewritePath("~/Produto.aspx?id=" + Data.Product.GetProductByDescription(product).Id);

  31:                  }

  32:              }

  33:          }

  34:   

  35:          #endregion

  36:      }


* Nesse exemplo está sendo utilizada somente a extensão ".aspx" por ser mais simples de exemplificar. Para tratar URLs com outras extensões é necessário configurar o IIS para tratar a extensão escolhida utilizando o componente do ASP.NET "c:\windows\...\aspnet_isapi.dll".

Segue abaixo vídeo que exibe passo-a-passo a solução:


Código fonte para download: clique aqui

Detalhes do ambiente de desenvolvimento
  • Linguagem: C#

  • Framework: .NET Framework 3.5 SP 1

  • Ferramenta: Visual Studio 2008 Development Edition

  • Sistema Operacional: Windows XP SP2

Nenhum comentário:

Postar um comentário