Redirect, Transfer, RewritePath: Kahraman Olan Hangisi?
Web oldum olası, "yönlendirme" diye bir şeye ihtiyaç duymuştur. İstemci-sunucu ilişkisinin derinliklerinden, sunucu tarafındaki işlem sürecine kadar her noktada makine dilindeki JUMP komutuna benzer şekilde bir sıçrama, işlem akışını başka bir mecraya yönlendirme gerekmiştir.
ASP.NET perspektifinden olaya bakarsak, o anda çalıştırılmakta olan bir sayfadan başka bir sayfaya/kaynağa yönlenmek demektir. Ve bu dünyada yönlenmenin üç türü var: Redirect, Transfer ve RewritePath. Her biri mimarinin değişik noktalarına dokunuyor. Farklı etkilere sahip. Dilerseniz ey okur, sırayla bunları inceleyelim ve tefekkür edelim.
Redirect... Response Redirect.
ASP'nin HTTP başlıklarından "Object Moved" olanını yansıtmaya yarayan metodu. ASP.NET'e de aynı isimle devroldu. Yönlenmek istediğiniz kaynağın adresini veriyorsunuz, ASP.NET sizin için istemciye (internet tarayıcısına) "bu nesne şu adrese taşındı" başlığı gönderiyor. Tarayıcı da size hissettirmeden bu mesajı alıp o adrese ulaşmaya çalışıyor.
Dikkat ederseniz bu tip yönlendirme işleminde istemci-sunucu arasında en azından iki gelip gitme mevcut. ASP.NET'e özgü olmayan, her web programlama ortamında uygulanabilecek HTTP başlığı ile yönlendirme, böyle bir gidip-gelme dezavantajı taşıyor.
Bu metodun istemci tarafına uzanmasından ötürü, istemci gittiği hedef adresi tabî olarak biliyor. Ve bu bir internet tarayıcısı ise, kullanıcıya da o adres gözüküyor.
HTTP başlığı ile yönlendirmeler için, fazladan git-gel dezavantajına rağmen kullanım alanı yoktur denemez. Dış adreslere doğru kullanıldığında anlamlı olmaktadır. Zaten dış adreslere yönlenmeyi sadece bu metod ile yapabilmektesiniz. Birazdan detaylarını anlatacağımız diğer metodların dış adreslere yönlendirme becerisi bulunmamaktadır.
Bir diğer kullanım amacı ise kalıcı yönlendirmeler yapmaktır. Kalıcı yönlendirmeler, Response.Redirect'ten farklı bir biçimde yapılsa da temeli aynıdır. Kalıcı yönlendirme, (Permanent Redirect) 301 durum koduyla istemciye yanıt döner. Bu tip yönlendirmeler özellikle adresi kesin olarak değişmiş içerik için kullanılmaktadır. İnsanlardan daha çok web robotlarına hitap etmektedir. Onlar bu kalıcı yönlendirme mesajını kaale alarak, bir dahasına yeni adrese gitmeleri gerektiğini öğrenirler. Meselâ sitenizin yazılım altyapısını diyelim. Eski URL'ler artık geçerli değilse, bu URL'leri indekslemiş uygulamalar 404 (Not Found) alıp duracaklardır. Eski müşteriyi kaybetmemek ve verilmiş emeği hiç etmemek için eski URL'lere baştan sona kalıcı yönlendirme çekmeniz pek akıllıca bir davranış olacaktır.
Transfer
Transfer halk arasında Server.Transfer olarak da bilinir. Yine ASP'den ASP.NET'e devrolmuş bir imkandır. Adı o kadar anlamlıdır ki, yaptığı işi tam olarak ifade eder: sunucuda transfer. Bu metodda transfer işlemini yapan sunucudur. İstemci tarafıyla ilgimiz kalmamıştır. Muhatabımız sayfamızı işleten sunucu. Ve biz ona "benden pes! şu sayfayı işlet" deriz. Sunucu yeni istediğimiz sayfa için yapacağı işleri bismillah çeker ve baştan alır.
Bu metodun en güzel tarafı, istemciye bir detayın yansımamasıdır. Ama sunucuyla ASP.NET çalışma dairesi arasında yeni bir git-gel'e vesile olduğu da unutulmamalıdır. Genelde iç taraftaki dizin ve sayfa yapısını kullanıcıya çaktırmadan çalışan siteler Server.Transfer'i tercih eder. Bu metodun kardeşi olan Server.Execute ise az farklı bir şekilde işler. İstenilen sayfayı işletir ve temel sayfaya geri döner. Çok daha uzun işlenebilecek bir konudur bu Server.Transfer. Bakarız efendim bir ara.
Transfer'in bir takım handikapları yok değildir. Meselâ transfer edebileceğiniz adres bir iç ASP.NET sayfasıdır. Aslında ASP devrinde bu ikinci sayfaya değer geçirme de başlı başlına sorundu ama ASP.NET'te "query string"ler çalışıyor, sağolsun MS. İkinci sayfada Request nesnesi her şeye rağmen, size ilk adresi verecektir.
RewritePath
Son dönemin tekniğidir. ASP.NET'in HttpContext nesnesi tarafından sunulur. Kol kırılır, yen içinde kalır misâli ASP.NET çalışma dairesinin içinde gerçekleşen bir yönlenmedir. Request nesnesindeki adresi ezer ve onu ikinci sayfanın bilgileriyle doldurur. Zaten bu işlemin adı da URL'yi yeniden yazmak. ASP.NET icra dairesi bu yeni URL'yi işlemeye başlar. Sunucu isteği ASP.NET icra dairesine teslim etmiş ve cevap bekliyordur. ASP.NET de yeni sayfayı işledikten sonra sonucu sunucuya aktarır. Sunucudan da kablolar üzerinden dağlar, taşlar ve ovalar geçerek istemciye ulaşır.
ASP.NET içerisindeki istemciye yansıtılmayacak yönlendirmeler için en uygun, en hızlı metod budur. İlk URL'ye ulaşmak için HttpContext'in Items koleksiyonunu sepet olarak kullanabilirsiniz. PostBack'lerle ilgili sıkıntı yaşanacaktır kuvvetli ihtimal. Bunun çözümü de daha detaylı bir makalenin konusu. Burada yakasını bırakıverelim isterseniz.
Son Söz
Yönlendirme tiplerinin arka planını bilmek bize bilinçli yönlendirme yapmayı temin eder. Karambole yönlendirmeler, uygulama performansını olumsuz etkileyebilir.
Bu yazıda maksatlı olarak kod örneği vermedik. Okuyucunun aradığı da çok kolay bulunabilecek kod örneklerinden ziyade, meselenin iç yüzüdür. Yani kodun arkasındaki iddiadır.
İddia ile.
