ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

URL Mapping veya ReWriting

Daron YÖNDEM
ASP.NET
10.03.2010 18:16:39
Hit : 8180

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.




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR