Como criar Url Amigável utilizando Global.asax

Atualmente é muito comum aplicações web, que exibem suas informações dinamicamente através do uso de scripts que rodam no servidor. Imagine uma página que exiba as informações completas de uma determinada notícia, a url seria algo como: http://www.site.com/noticias.aspx?id=3,onde 3 é o código identificador da notícia.
Isto é muito interessante, porém, normalmente encontram-se URLs grandes ou complicadas demais, difíceis de memorizar e sem significado, onde até mesmo, dificulta a indexação do site por mecanismos de busca.
O ASP.NET 2.0 traz recursos de URL rewriting, onde permitem criar URLs amigáveis, por exemplo, pode-se permitir que o usuário acesse a notícia 3, citada no exemplo acima, da seguinte maneira : http://www.site.com/noticia,3,titulo-da-noticia ..
O exemplo mostrado neste artigo é de simples entendimento, será criada uma simples aplicação onde possua uma página que contenha uma listagem de notícias, sendo que, quando o usuário clicar no link da notícia que deseja ler, este será redirecionado a uma página de visualização, onde mostrará o identificador desta notícia.
Utilizando o Visual Studio 2008, crie uma página chamada Default.aspx, adicione 3 HyperLinks, identificados como: hlNoticia1, hlNoticia2 e hlNoticia 3. Defina a propriedade Text da seguinte maneira: "Título da primeira notícia", "Título da segunda notícia" e "Título da terceira notícia", respectivamente. Posicione os componentes em tela, observe na Figura 1.
Figura 1 – HyperLinks posicionados
Figura 1 – HyperLinks posicionados
Em seguida, será adicionado os links para cada "notícia", imagine que, quando forem clicados, deve-se transferir através de QueryString o ID para a página Noticia.aspx, para que a notícia visualizada por completo, ou no nosso caso, exibir o identificador na página.
Adicione o link do primeiro HyperLink da seguinte maneira : "noticias.aspx?id=1". Agora imagine uma URL, que atinja este objetivo, como exemplo, pode-se criá-la da seguinte forma: "noticia,1,titulo-da-primeira-noticia.aspx". Perceba que, neste endereço de URL, foi adicionado o "id" de valor "1" e o título da notícia, tornando assim, um endereço mais simples de se trabalhar.
Adicione os seguintes links para os componentes:
hlNoticia1 - noticia,1,titulo-da-primeira-noticia.aspx
hlNoticia2 - noticia,2,titulo-da-segunda-noticia.aspx
hlNoticia3 - noticia,3,titulo-da-terceira-noticia.aspx
Agora, compile a aplicação, perceba que, ao clicar no link, será gerado o seguinte erro "The resource cannot be found.", pois o servidor não encontrou a página informada. Isso acontece por que o diretório informado não existe, então, para que este diretório seja funcional, deve-se criar a página Noticias.aspx, pois esta irá exibir toda a notícia detalhada.
Após criar esta nova página da web, deve-se configurar a aplicação para que, ao clicar no hlNoticia1, seja direcionado ao endereço "noticia,1,titulo-da-primeira-noticia.aspx", e a aplicação interprete este diretório da seguinte maneira: "Noticias.aspx?id=1".
Para exemplificar a visualização, no Page_Load da página Noticias.aspx, adicione o seguinte código:
string id = Request.QueryString["id"];
Response.Write("Identificador da notícia: " + id);
Para que a aplicação interprete a url amigável e entenda que é a página Noticias.aspx, deve-se adicionar um Global.asax, como mostra a Figura 2.
Figura 2 – Add new Global.asax
Figura02 – Add new Global.asax
Através do Global.asax, pode-se executar um determinado código quando a aplicação é iniciada/finalizada ou até mesmo quando qualquer página da aplicação for requisitada,
No Global.asax, adicione o seguinte método abaixo:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpContext incoming = HttpContext.Current;
    string oldpath = incoming.Request.Path.ToLower();
    string pageid;
    Regex regex = new Regex(@"noticia,(\S+),(\S+).aspx", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
    MatchCollection matches = regex.Matches(oldpath);
    if(matches.Count > 0)
    {
        //Extrai o id da noticia e envia para Noticias.aspx
        pageid = matches[0].Groups[1].ToString();
incoming.RewritePath(string.Format("Noticias.aspx?id={0}&titulo={0}", pageid));
    }
}
Deve-se entender que, o método Application_BeginRequest é disparado cada vez que uma nova requisição é efetuada, portanto antes de a página ser carregada, este método será executado.
Entendendo o código:
Perceba que, inicialmente foi instanciado a variável icoming, recebendo o contexto da aplicação, em seguida duas strings foram criadas, oldpath e pageid, sendo que uma irá receber o caminho absoluto da url, e a outra receberá o id passado na URL, respectivamente.
Foi usado o Regex com o código (@"noticia,(\S+),(\S+).aspx que é uma expressão regular. Observe que, essa expressão regular recebe a url passada, sendo que, o primeiro parâmetro contém o valor do ID da notícia e o segundo possui o título.
Veja que, incoming.RewritePath irá redirecionar a url amigável para a página correta, passando o id e o título da mesma.
Execute o projeto e perceba que, quando clicar sobre qualquer hyperlink q está na Default.aspx, será redirecionado para a pagina Noticias.aspx de uma forma amigável, observe a Figura 3.
Figura 3 – Página com Url Amigável
Figura 3 – Página com Url Amigável
O intuito deste artigo foi apresentar como criar URLs amigáveis, tanto para o usuário quanto para os mecanismos de busca. Escreva soluções que concretizem sua necessidade, utilize a criatividade e atinja seus objetivos de forma eficaz.

Leave a Reply