Merhaba Arkadaşlar,
ASP.NET projelerinde geliştirici olarak çalışanlarımız mutlaka page'lerin gerçek path'lerini gizlemeleri gereken bir seneryo ile karşılaşmışlardır. Tabii bunu yapmanın birden fazla yolu var. Özellikle MVC framework ile gelen routing yapısının VS 2008 SP1'den sonra ASP.NET projelerinde de kullanılabiliyor olması bu işi bir hayli kolaylaştırdı. Buna karşın benim bu yazıda ki niyetim sizlerle HttpContext.RewritePath metoduna göz atmak.
Nedir bu HttpContext.RewritePath metodu? Cevabını hemen vereyim, bu metod ile http talebinin gönderildiği sayfanın url'ini değiştirmeden arka tarafta başka bir sayfaya talebi yönlendirebiliriz. Açıklama biraz kafa karıştırıcı olabilir. Daha iyi açıklayabilmek için şöyle bir örneklendirme yapabilirim; "Sayfa1.aspx" isimli page'ten "Sayfa2.aspx" isimli bir sayfaya talepte bulunabilir ancak bu talebe "Sayfa3.aspx" in yanıt vermesini sağlayabilirim. Tüm bunlar olurken de url "Sayfa2.aspx" olarak gözükecektir. İsterseniz gelin bir örnek ile olayı daha iyi anlamaya çalışalım.
Sayfa1.aspx
<body>
<form id="form1" runat="server">
<div>
Hello Sayfa1.aspx
<br />
<asp:Button ID="btn" runat="server" Text="Star RewriteUrl" onclick="btn_Click" />
</div>
</form>
</body>
|
Sayfa2.aspx
<body>
<form id="form1" runat="server">
<div>
Hello Sayfa2.aspx
</div>
</form>
</body>
|
Sayfa3.aspx
<body>
<form id="form1" runat="server">
<div>
Hello Sayfa3.aspx
</div>
</form>
</body>
|
Örnegimiz için kullanacagimiz sayfalarin body'leri yukarida ki gibidir ("Sayfa1.aspx" i başlangı sayfası olarak set etmeyi unutmayalım). Yukarı da metodun kullanımı örneklendirmek için kullandığım örneği burada da kullanıyor olacağız. "Sayfa1.aspx" ten "Sayfa2.aspx" e yapılan http taleplerine "Sayfa3.aspx" yanıt verecek ancak clien browser'ında url olarak "Sayfa2.aspx" gözükecek. O halde uygulama bazında başlatılan talepleri kontrol edebiliyor olmamız lazım. Bunu da Global.asax dosyasının "Application_BeginRequest" event'i içerisinde yapabiliriz. O halde gelin yapılan talepler ile biraz oynayalım.
Sayfa1.aspx.cs
protected void btn_Click(object sender, EventArgs e)
{
Response.Redirect("Sayfa2.aspx");
}
|
Global.asax.cs
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Path.Contains("Sayfa2"))
{
Context.RewritePath("Sayfa3.aspx?kisi=Tolga AYKURT");
}
}
|
Sayfa3.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Page.Response.Write("Bu sayfaya " + Request.QueryString["kisi"].ToString() + " tarafından talep yapılmıştır...");
}
}
|
Sizin de 3'üncü satırda gördüğünüz gibi çeşitli şartlar kullanarak gelen talebi yeniden yönlendirebiliyoruz. Gerçekten çok hoş. Şayet yönlenmek istediğimiz sayfa bulunamazsa (etki alanı dışına talepte bulunamazsınız), HttpException istisnası ile yüzleşmek zorunda kalırız.
Örneklerde de görüldüğü gibi kendi url yapınızı projelerinize uygulayabilirsiniz. Tüm bunlardan bahsettikten sonra çok önemli bir noktayı da belirtmek istiyorum. Microsoft tarafından, arama motoru optimizasyonu, daha kullanıcı dostu olması ve daha güçlü bir yapı içermesinden dolayı ASP.NET routing, RewritePath'e alternatif olarak tavsiye edilmektedir.
Uygulamaya Ait Kaynak Kodlar - RewritePath.rar (25,18 kb)