Bu aralar karşılaştığım ilginç sorulardan biri de URL Mapping hakkında. İnternette gezerken dikkatinizi çekmiştir, bazı sitelerde www.adres.com/bu+bir+makale/default.aspx gibi adresler kullanılıyor. İşte buna URL Mapping deniyor. Bu işlemi, aslında var olmayan bir adresi varmış gibi kullanarak esasen var olan başka bir adrese arka planda yönlendirmek şeklinde tanımlayabiliriz.
Örneğin:
www.ornek.com/urunler.aspx?ID=5
gibi bir adres yerine
www.ornek.com/5/default.aspx
şeklinde adresler kullanabiliyorsunuz.
Biz de bu konuda bir örnek yaparak yukarıdaki gibi bir adresi dönüştürmeyi deneyelim. Örneğimizde kullanmak üzere bir default.aspx yaratıyoruz ve basit bir şekilde sayfaya bir adet yerleştirerek QueryString üzerinden gelecek ID bilgisini Label içerisine yazdıracağız.
[default.aspx]
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_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>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
[default.aspx.vb]
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Label1.Text = Request.QueryString("ID")
End Sub
End Class
Sayfamızı hazırladığımıza göre sıra geldi mapping işlemini yapmaya. Projemize bir adet Global.asax (Global Application Class) eklememiz gerekiyor. Projeye "Solution Explorer" içerisinde sağ tuş tıklayarak "Add new item" diyerek söz konusu dosyayı ekleyebilirsiniz. Sonrasında Global.asax içerisinde Application'a ait BeginRequest durumunu yakalayarak mapping kodumuzu yazacağız.
<%@ Application Language="VB" %>
<script runat="server">
Protected Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
Dim GelenAdres As String = Context.Request.Url.AbsolutePath
Dim GelenID As String = GelenAdres.Substring(GelenAdres.IndexOf("/", GelenAdres.IndexOf("WebSite15")) + 1, GelenAdres.IndexOf("default.aspx") - GelenAdres.IndexOf("/", GelenAdres.IndexOf("WebSite15")) - 2)
Context.RewritePath("../default.aspx?ID=" & GelenID)
End Sub
</script>
Gelelim yukarıda neler yaptığımıza. İlk satırda GelenAdres adında bir değişken yaratarak buraya kullanıcının talepte bulunduğu adresin yolunu kopyalıyorum. Bu adres metni içerisinde /5/ gibi duran ID bilgisini almam gerekiyor. Ben bu işlemi standart String işlemleri ile yaptım, oysa güzel bir RegularExpression çok daha hoş durabilir. İhtiyaçlarınıza göre istediğiniz metodu kullanabilirsiniz. ASP.NET Development Server kullandığım için benim sitem bir WebSite15 denen bir klasör içerisinde açıldı. O nedenle string işlemlerimi şimdilik ona göre yazdım. Son olarak da Context nesnesine ait RewritePath metodu ile esas açılacak olan adresi belirtiyorum. Yakalamış olduğum ID bilgisini adresin sonuna ekliyorum.
Artık www.ornek.com/5/default.aspx adresine giden kullanıcılar için aslında www.ornek.com/default.aspx?ID=5 adresi açılıyor ama bunu hiçbir kullanıcı görmüyor. Örneği bir adım ileri taşıyarak www.ornek.com/Bu+bir+metin/default.aspx şeklindeki adreslerin de www.ornek.com/default.aspx?ID=5 şekline dönüşmesini sağlayabilirsiniz. Tek yapmanız gereken gelen başlik bilgisini alip ona uygun ID'yi veritabanından çekerek yeni adrese aktarıyor olmak.
Mapping yaptığımız tüm adreslerin sonunda .aspx uzantılı bir dosya adresi kullandık. Bunun nedeni sadece .aspx uzantılı dosyaların IIS 6.0 üzerinde asp.net motoruna bağlı olması. Bu durum IIS'e admin erişiminiz varsa özel ayarlarla tabi ki değiştirilebilir. Yakın zamanda Server 2008 lansmanı ile IIS7.0 da kullanıyor olacağız. IIS7.0'ın mimari yapısındaki değişiklikler sonucu yukarıdaki kodu IIS 7.0 üzerinde çalıştırdığınızda tüm istekler dosya uzantısına bakılmadan map edilebilecektir.
Yukarıdaki taktiğin yanı sıra HttpModule yazarak URL Mapping işlemini daha performanslı bir hale getirmek de mümkün. Umarım o konuda da yakında uzun bir makale yazma şansım olur :)
Hepinize kolay gelsin.