Com o avanço das paginas web, seu conteúdo, ficou muito mais dinâmico, fazendo uso de script que rodam no servidor (Server-side), gerando conteúdos dinâmicos a essas paginas.

Com isso muitos desenvolvedores usam a técnica de colocar uma identificação do seu conteúdo no final da pagina, como querystring, ficando assim “http://www.meusite.com.br/pagina.aspx?id=xxxyyyzzz”.

Com isso as urls ficaram grandes demais, tornando muito difícil sua memorização, e até mesmo dificultando a indexação do site, por mecanismo de busca.

Então vamos aprender como trocar a url acima por algo do tipo “HTTP://www.meusite.com.br/carros/1/gol.aspx”, tornando muito mais amigável essa url e de fácil memorização.

Essa técnica, se chamada url amigável. Existem diversas formas de criar url amigável, usando ASP.NET Routing, urlMappings, entre outras. Vamos ao nosso exemplo.

Crie um projeto no visual Studio do tipo Asp.net Web site:

Criando um projeto no visual Studio do tipo Asp.net Web site
Criando um projeto no visual Studio do tipo Asp.net Web site.

Vamos adicionar uma classe, que chamaremos de url.

Adicionando uma classe
Adicionando uma classe.

Agora iremos implementar a interface IHttpModule a nossa classe url. Após sua implementação, dois métodos serão criados o Dispose e Init.

public class url:IHttpModule
	{
		public url() {
		//
		// TODO: Add constructor logic here
		//
	}
	#region IHttpModule Members

	public void Dispose()
	{
		throw new NotImplementedException();
	}

	public void Init (HttpApplication context)
	{
		throw new NotImplementedException();
	}
	#endregion

	}

No método Init iremos adicionar um evento ao parâmetro context, para ser chamado após o inicio da requisição.

public void Init(HttpApplication context)
{
	// adicionando um evento após iniciar uma requisição
	context.BeginRequest += new EventHandler(context_BeginRequest);
}

No método Init iremos adicionar um evento ao parâmetro context, para ser chamado após o inicio da requisição.

private void context_BeginRequest(object sender, EventArgs e)
{
	// pega o context da aplicação, fazendo o cast
	HttpContext context = ((HttpApplication)sender).Context;

	// pega a URL que está sendo requisitada
	string path = context.Request.Path.Tolower();

	// cria uma regex para a sua URL
	// \w = qualquer caractere alfanumérico, mais underscore (_);
	// \d = qualquer digito de 0 a 9; equivalente a [0-9]
	Regex regex = new Regex (@"(\w+)/(\d+)/(\w+).aspx", RegexOptions.IgnorePatternWhitespace);

	// recebe seus macthes, passando a URL da resquisição
	MatchCollection matches = regex.Matches(path);

	// se estiver ok, então terá alguns matches
	if (matches.Count>0)
	{
		// pega o segundo grupo de matche que será nosso id
		string id = matches[0].Groups[2].ToString();

		// faz um case para fazero redirect
		switch (matches[0].Groups[1].ToString())
		{
			case "carros":
			Redirect (context, "carros", id);
			break;

			default:
			break;
		}
	}
}

Não se esqueça de colocar o namespace do Regex para que funcione, como abaixo.

using System.Text.RegularExpressions;

Para deixar a aplicação um pouco mais organizada criamos um switch, para redirecionar nossa url a uma pagina específica, que no nosso caso é o produto carro terá um layout diferente.

Criando o método Redirect e o GetQueryString:

private static void Redirect (HttpContext context, string detalhe, string detalhe, string id)
{
	// recebe o context, o id e detalhes da página específica
	// faz o rewritePath
	context.RewritePath(VirtualPathUtility.ToAbsolute("~") + "/" + detalhe + "/default.aspx?id=" + id + GetQueryString(context), false);
}

private static string GetQueryString(HttpContext context)
{
	string query = context.Request.QueryString.ToString();
	if (!string.IsNullOrEmpty(query))
	return "&" + query;

	return string.Empty;
}

O Método Redirect é responsável por reescrever a nova url e o método GetQueryString, por inserir algum querystring, se for necessário.

Agora vamos criar uma pasta chamada carros e um página default.aspx dentro de carro, conforme imagem abaixo:

Criando uma pasta chamada carros e um página default.aspx
Criando uma pasta chamada carros e um página default.aspx.

Pegando o id da pagina carros/default.aspx:

protected void Page_Load(object sender, EventArgs e)
{
	if (!string.IsNullOrEmpty(Request.QueryString["id"]))
	{
		string id = Request.QueryString["id"];

		Response.Write("id: " + id);
	}
}

Veja que, apenas estamos escrevendo o id na página, mas nesse momento podemos consultar alguma informação do banco de dados.

Vamos incluir a tag httpModules no web.config, responsável, por chamar a classe url a cada requisição.

<httpModules>
	<add name="url"  type="url" />
</httpModules>
Testando nossa aplicação
Testando nossa aplicação.

Chamamos uma página que não existe e mesmo assim o httpmodule reescreveu a url.

Podemos também ao invés de passar o id no meio da url, fazer uma consulta no banco de dados pegando esse id, existem várias maneiras de se fazer isso, essa é só mais uma.

Confira também