Exemplo de compactador de URL com Entity Framework e URL Rewrite com ASP.NET.
Você pode fazer download do código fonte do exmplo no final do artigo. Abaixo vou mostrar a extrutura e o código.
UrlModel.edmx (ADO.NET Entity Data Model)
Dados.mdf
Abaixo o código para reescrever a URL (URL Rewrite)
Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext httpContext = HttpContext.Current;
//Pega a URL
string sDefaultPath = Context.Request.Path;
string[] arrDefaultPath = sDefaultPath.Split('/');
//Verifica se a URL possui duas ou mais "/"
if (arrDefaultPath.Length > 2)
{
//Verifica se o segundo item do array é "r" (my.url/r/0880dd3)
if (arrDefaultPath[1] == "r")
{
//URL real
httpContext.RewritePath("/default.aspx?Id=" + arrDefaultPath[2]);
}
}
}
Esta será a página que vai fazer a listagem, que vai compactar e fazer o redirect.
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CompactadorUrl.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Compactador de Url</title>
</head>
<body>
<!-- NOTA: O nome desta página é default.aspx, mas será reescrita, passando a ser "r",
pois significa redirecionamento, e também, para que a url final fique bem pequena. -->
<form id="form1" runat="server">
<div>
Url: <asp:TextBox runat="server" ID="txtUrl" Width="500px" />
<asp:Button Text="Compactar" runat="server" ID="btnCompactar" onclick="btnCompactar_Click" />
<br />
<asp:ListView runat="server" ID="lvLinks" ViewStateMode="Disabled">
<ItemTemplate>
<ul>
<li>
Url Compactada: <a href="r/<%#Eval("CodRedirecionamento")%>">my.url/r/<%# Eval("CodRedirecionamento")%></a> <br />
Url original: <strong><%# Eval("UrlOriginal") %></strong><br />
Cliques: <%# Eval("Cliques") %>
</li>
</ul>
</ItemTemplate>
<EmptyDataTemplate>
Nenhuma url compactada!
</EmptyDataTemplate>
</asp:ListView>
</div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CompactadorUrl
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Pego o Id que veio mascarado na Url
string codigo = Request.QueryString["Id"];
//Variável utilizada no redirecionamento
string UrlOriginal;
//Se o Id for diferente de null...
if (codigo != null)
{
//Instancio o contexto
using (UrlEntities ctx = new UrlEntities())
{
//Pego o objeto de acordo com a url
Url obj = ctx.Url.FirstOrDefault(
x => x.CodRedirecionamento == codigo);
//Incremento a quantidade de cliques da url em questão
obj.Cliques = obj.Cliques + 1;
//Faço minha variável receber a url original que está no banco
UrlOriginal = obj.UrlOriginal;
//Salvo as alterações
ctx.SaveChanges();
}
//Redireciono
Response.Redirect(UrlOriginal);
}
AtualizaLV();
}
//Source do ListView
private void AtualizaLV()
{
using (UrlEntities ctx = new UrlEntities())
{
lvLinks.DataSource = ctx.Url.OrderByDescending(
x => x.Id);
lvLinks.DataBind();
}
}
protected void btnCompactar_Click(object sender, EventArgs e)
{
//Crio uma variável para receber o Guid
string g = Guid.NewGuid().ToString("D");
//Instancio o contexto
using (UrlEntities ctx = new UrlEntities())
{
//Crio o objeto
Url obj = new Url();
//Atribuo cada valor ao seu respectivo atributo
obj.UrlOriginal = txtUrl.Text;
//Pego um pedaço do Guid que será o código de redirecionamento da url
obj.CodRedirecionamento = g.ToString().Substring(0, 7);
obj.Cliques = 0;
ctx.Url.AddObject(obj);
//Salvo as alterações
ctx.SaveChanges();
}
//Atualizo o ListView
AtualizaLV();
}
}
}
Download do banco de dados e código fonte deste exemplo.
Créditos:
Saulo G. Pacífico
facebook.com/SauloPacifico
twitter.com/saulopacifico
www.sgpdesign.com.br