Arasındaki fark nedir Server.Transfer
ve Response.Redirect
?
- Her birinin avantajları ve dezavantajları nelerdir?
- Biri diğerine ne zaman uygundur?
- Ne zaman uygun değildir?
Server.TransferRequest
yerine kullanmayı düşünebilirsiniz Server.Transfer
.
Arasındaki fark nedir Server.Transfer
ve Response.Redirect
?
Server.TransferRequest
yerine kullanmayı düşünebilirsiniz Server.Transfer
.
Yanıtlar:
Response.Redirect
tarayıcıya bir mesaj (HTTP 302) gönderir .
Server.Transfer
tarayıcı bir şey bilmeden olur, tarayıcı bir sayfa ister, ancak sunucu başka bir sayfanın içeriğini döndürür.
Response.Redirect()
sizi yeni bir sayfaya gönderir, adres çubuğunu günceller ve Tarayıcı Geçmişine ekler. Tarayıcınızda tekrar tıklayabilirsiniz.
Server.Transfer()
adres çubuğunu değiştirmez. Geri dönemezsiniz.
Server.Transfer()
Kullanıcının nereye gittiğimi görmesini istemediğimde kullanıyorum . Bazen "yükleme" türünde bir sayfada.
Aksi takdirde her zaman kullanacağım Response.Redirect()
.
Kısa olması: Response.Redirect
tarayıcıya başka bir sayfayı ziyaret etmesini söyler. Server.Transfer
sunucu isteklerini azaltmaya yardımcı olur, URL'yi aynı tutar ve küçük bir hata ile sorgu dizesini ve form değişkenlerini aktarmanıza olanak tanır.
Bulduğum ve kabul ettiğim bir şey ( kaynak ):
Server.Transfer
kullanıcıyı benzer bir ifadeyle başka bir sayfaya göndermesi bakımından benzerdirServer.Transfer("WebForm2.aspx")
. Bununla birlikte, ifadenin birçok farklı avantajı ve dezavantajı vardır.İlk olarak, kullanarak başka bir sayfaya aktarım
Server.Transfer
sunucu kaynaklarını korur. Tarayıcıya yeniden yönlendirmesini söylemek yerine, Web sunucusundaki "odağı" değiştirir ve isteği aktarır. Bu, HTTP sunucunuzun baskısını azaltan ve uygulamalarınızın daha hızlı çalışmasını sağlayan çok fazla HTTP isteği almamanız anlamına gelir.Ancak dikkat edin: "aktarma" işlemi yalnızca sunucuda çalışan sitelerde çalışabileceğinden;
Server.Transfer
kullanıcıyı harici bir siteye göndermek için kullanamazsınız .Response.Redirect
Bunu sadece yapabilir.İkinci olarak,
Server.Transfer
orijinal URL'yi tarayıcıda tutar. Bu, hata ayıklama sırasında karışıklık yaratabilmesine rağmen, veri giriş tekniklerini kolaylaştırmaya yardımcı olabilir.Hepsi bu kadar değil:
Server.Transfer
Yöntemin ikinci bir parametresi de var - "preserveForm". Bunu olarak ayarlarsanız , varolan sorgu dizesi ve herhangi bir form değişkeniTrue
gibi bir ifade kullanarakServer.Transfer("WebForm2.aspx", True)
aktardığınız sayfaya erişebilirsiniz.Örneğin, WebForm1.aspx dosyanızda TextBox1 adlı bir TextBox denetimi varsa ve preserveForm parametresi True olarak ayarlanmış olarak WebForm2.aspx dosyasına aktarıldıysa, özgün sayfa TextBox denetiminin değerini başvurarak alabilirsiniz
Request.Form("TextBox1")
.
maintaining the original URL... ...really help streamline data entry techniques
?
Response.Redirect()
şu durumlarda kullanılmalıdır:
Server.Transfer()
şu durumlarda kullanılmalıdır:
Response.Redirect, ilk sayfa istemciye geldikten sonra sayfayı başka bir sayfaya yönlendirir . Böylece müşteri yönlendirmeyi bilir.
Server.Transfer sayfanın geçerli yürütülmesini sonlandırır. İstemci yeniden yönlendirmeyi bilmiyor. Sorgu dizesini ve form değişkenlerini aktarmanıza olanak tanır.
Bu yüzden hangisinin daha iyi olduğunu seçmek ihtiyaçlarınıza bağlıdır.
Response.Redirect
, aradığım halde orijinal sayfayı yüklemek için atlayabilir Response.Redirect
mi?
"response.redirect" ve "server.transfer", sayfa yürütülürken kullanıcının bir sayfadan diğer sayfaya aktarılmasına yardımcı olur. Ancak bu aktarımı / yönlendirmeyi yapma şekilleri çok farklıdır.
Görsel bir adam olmanız ve teori yerine gösteriyi görmek istiyorsanız, farkı daha açık bir şekilde açıklayan aşağıdaki facebook videosunu görmenizi öneririm.
https://www.facebook.com/photo.php?v=762186150488997
Aralarındaki temel fark, transferi kimin yaptığıdır. "Response.redirect" dosyasında aktarım, "server.transfer" klasöründe iken tarayıcı tarafından yapılır. Bu ifadeyi daha ayrıntılı bir şekilde anlamaya çalışalım.
"Server.Transfer" de aktarımın nasıl gerçekleştiği sırası aşağıdadır: -
Kullanıcı bir ASP.NET sayfasına istek gönderir. Aşağıdaki şekilde, istek "WebForm1" e gönderilir ve "Webform2" ye gitmek isteriz.
2.Sunucu "Webform1" i yürütmeye başlar ve sayfanın yaşam döngüsü başlar. Ancak sayfanın tüm yaşam döngüsü tamamlanmadan önce "Server.transfer" "WebForm2" olur.
3. "Webform2" sayfa nesnesi oluşturulur, tam sayfa yaşam döngüsü yürütülür ve çıktı HTML yanıtı tarayıcıya gönderilir.
"Response.Redirect" içindeyken navigasyon için olayların sırası aşağıdadır: -
1. İstemci (tarayıcı) bir sayfaya istek gönderir. Aşağıdaki şekilde, istek "WebForm1" e gönderilir ve "Webform2" ye gitmek isteriz.
2. "Webform1" öğesinin yaşam döngüsü yürütülmeye başlar. Ancak yaşam döngüsü arasında "Response.Redirect" olur.
Şimdi sunucu yeniden yönlendirme yapmak yerine tarayıcıya bir HTTP 302 komutu gönderir. Bu komut tarayıcıya "Webform2.aspx" sayfasına bir GET isteği başlatması gerektiğini bildirir.
4.Browser 302 komutunu yorumlar ve "Webform2.aspx" için bir GET isteği gönderir.
Başka bir deyişle, "Response.Redirect" sunucu tarafından yürütülürken "Server.Transfer" sunucu tarafından yürütülür. "Response.Redirect" sayfanın yönlendirmesini yapmak için iki istek gerekiyor.
Peki "Server.Transfer" ne zaman ve "Response.Redirect" ne zaman kullanılır?
Aynı sunucuda bulunan sayfalarda gezinmek istediğinizde "Server.Transfer" kullanın, farklı sunucuda ve etki alanında bulunan sayfalar arasında gezinmek istediğinizde "Response.Redirect" kullanın.
Aşağıda, farkları ve hangi senaryoyu kullanacağını gösteren bir özet tablo bulunmaktadır.
Server.Transfer
: aynı sunucu veya aynı IIS web sitesinde ?
Server.Transfer'ın güzelliği onunla yapabileceğiniz şeydir:
TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");
Yukarıdaki yöntemi kullanarak Server.Transfer kullandığınız halde Response.Redirect kullandığınız sürece önceki sayfanızdan herhangi bir şey alabilirsiniz.
ScarletGarden'in yorumuna ek olarak, arama motorlarının ve yönlendirmenizin etkisini de göz önünde bulundurmanız gerekir. Bu sayfa kalıcı mı taşındı? Geçici? Bir fark yaratır.
bkz. Response.Redirect vs. "301 Kalıcı Olarak Taşındı" :
Hepimiz Response.Redirect'i şu anda kullandık. Ziyaretçilerin bir şekilde yanlış yere gitmeleri halinde ziyaretçileri doğru yöne yönlendirmenin hızlı ve kolay yolu. Ama gerçekten "301 Kalıcı Olarak Taşındı" göndermek istediğinizde Response.Redirect'in "302 Bulundu" HTTP yanıt durumu kodu gönderdiğini biliyor muydunuz?
Ayrım küçük görünüyor, ancak bazı durumlarda aslında büyük bir fark yaratabilir. Örneğin, "301 Kalıcı Olarak Taşındı" yanıt kodu kullanırsanız, çoğu arama motoru eski bağlantıyı dizinlerinden kaldırır ve yenisiyle değiştirir. "302 Bulundu" kullanırsanız, eski sayfaya dönmeye devam ederler ...
Aktarım tamamen sunucu tarafındadır. İstemci adres çubuğu sabit kalır. Bağlamın istekler arasında aktarılmasıyla ilgili bazı karmaşıklıklar. Sayfa işleyicilerin yıkanması ve yeniden başlatılması pahalı olabilir, bu nedenle aktarım işleminizi boru hattının başlarında, örneğin BeginRequest sırasında bir HttpModule'de yapın. MSDN belgelerini dikkatle okuyun ve HttpContext.Request'in yeni değerlerini test edin ve anlayın - özellikle Postback senaryolarında. Hata senaryoları için genellikle Server.Transfer kullanırız.
Yönlendirme, 302 durumu ve istemci tarafı gidiş dönüş yanıtıyla isteği sonlandırır ve dahili olarak bir istisna (küçük sunucu mükemmel isabet - günde kaç kez yaptığınıza bağlıdır) Müşteri daha sonra yeni adrese gider. Tarayıcı adres çubuğu ve geçmiş güncellemeleri vb. Müşteri ekstra bir gidiş dönüş ücretini öder - maliyet gecikmeye bağlı olarak değişir. İşimizde çok fazla yönlendirme yapıyoruz, istisna maliyetinden kaçınmak için kendi modülümüzü yazdık.
Yukarıda belirtildiği gibi birçok fark vardır. Her şeyden öte, bir fark daha var. Response.Redirect()
kullanıcıyı uygulamanın bir parçası olmayan herhangi bir sayfaya yönlendirmek için kullanılabilir, ancak Server.Transfer()
yalnızca uygulama içinde kullanıcıyı yönlendirmek için kullanılabilir.
//This will work.
Response.Redirect("http://www.google.com");
//This will not work.
Server.Transfer("http://www.google.com");
Response.Redirect, nereye gideceğini bulmak için sunucuya ekstra bir gezi eklediğinden daha maliyetlidir.
Sunucu.Transfer daha verimlidir, ancak Url fiziksel olarak değişmediğinden kullanıcıya biraz yanlış yönlendirebilir.
Deneyimlerime göre, performans farkı, ikinci yaklaşımı kullanacak kadar önemli olmamıştır.
Server.Transfer, istemci tarayıcısındaki URL'yi değiştirmez, bu nedenle tarayıcı başka bir sunucu tarafı işleyicisine değiştirdiğinizi etkili bir şekilde bilmez. Response.Redirect tarayıcıya farklı bir sayfaya geçmesini söyler, böylece başlık çubuğundaki URL değişir.
Server.Transfer, sunucuya bir gidiş dönüşten kaçındığından biraz daha hızlıdır, ancak url'de değişiklik yapmama, ne yapmaya çalıştığınıza bağlı olarak sizin için iyi veya kötü olabilir.
Response.Redirect: tarayıcıya istenen sayfanın yeni bir konumda bulunabileceğini söyler. Tarayıcı daha sonra içeriğini tarayıcıya yükleyen yeni sayfaya başka bir istek başlatır. Bu, tarayıcı tarafından iki istekle sonuçlanır.
Server.Transfer: İlk sayfadan sunucudaki ikinci sayfaya yürütmeyi aktarır. Tarayıcı istemcisi söz konusu olduğunda, bir istekte bulundu ve ilk sayfa içerikle yanıt veren sayfa. Bu yaklaşımın yararı, istemci tarayıcıdan sunucuya bir daha az gidiş dönüş olmasıdır. Ayrıca, yayınlanan form değişkenleri ve sorgu dizesi parametreleri de ikinci sayfada kullanılabilir.
Transfer () hakkında daha fazla ayrıntı, aslında Server.Execute () + Response.End (), kaynak kodu aşağıdadır (Mono / .net 4.0'dan):
public void Transfer (string path, bool preserveForm)
{
this.Execute (path, null, preserveForm, true);
this.context.Response.End ();
}
ve Execute () için, çalıştırmanın yolu verilen yolun işleyicisidir , bkz.
ASP.NET, geçerli kullanıcının Yürütme yöntemi tarafından sağlanan kaynağı görüntüleme yetkisine sahip olduğunu doğrulamaz . ASP.NET yetkilendirme ve kimlik doğrulama mantığı özgün kaynak işleyicisi çağrılmadan önce çalışsa da, ASP.NET doğrudan Execute yöntemi tarafından belirtilen işleyiciyi çağırır ve yeni kaynak için kimlik doğrulama ve yetkilendirme mantığını yeniden çalıştırmaz. Uygulamanızın güvenlik ilkesi istemcilerin kaynağa erişmek için uygun yetkiye sahip olmasını gerektiriyorsa, uygulama yeniden yetkilendirmeyi zorlamalı veya özel bir erişim denetim mekanizması sağlamalıdır.
Execute yöntemi yerine Redirect yöntemini kullanarak yeniden yetkilendirmeyi zorlayabilirsiniz . Yeniden yönlendirme, tarayıcının yeni kaynağı istediği istemci tarafı yeniden yönlendirme gerçekleştirir. Bu yönlendirme sisteme giren yeni bir istek olduğundan, hem Internet Information Services (IIS) hem de ASP.NET güvenlik ilkesinin tüm kimlik doğrulama ve yetkilendirme mantığına tabidir.
- MSDN'den
Response.Redirect ekstra bir gidiş-dönüş yolculuğu içerir ve adres çubuğunu günceller.
Server.Transfer adres çubuğunun değişmesine neden olmaz, sunucu isteğe başka bir sayfadaki içerikle yanıt verir
Örneğin
Response.Redirect: -
Server.Transfer: -
Response.Redirect
Artıları: - RESTful - Adres çubuğunu değiştirir, adres isteklerin arasındaki durum değişikliklerini kaydetmek için kullanılabilir.
Eksileri: - Yavaş - İstemci ve sunucu arasında ekstra bir gidiş-dönüş var. İstemci ve sunucu arasında önemli bir gecikme olduğunda bu pahalı olabilir.
Server.Transfer
Artıları: - Çabuk.
Eksileri: - Durum kaybı - Geri gönderme yanıtına yanıt olarak uygulamanın durumunu değiştirmek için Server.Transfer kullanıyorsanız, sayfa yeniden yüklenirse, adres çubuğu olduğu gibi aynı durum kaybolacaktır ilk istek üzerine.
Response.Redirect Response.Redirect () sizi yeni bir sayfaya gönderir, adres çubuğunu günceller ve Tarayıcı Geçmişine ekler. Tarayıcınızda tekrar tıklayabilirsiniz. İsteği sunucumuzdaki bazı düz HTML sayfalarına veya başka bir web sunucusuna yönlendirir. Her istekte sunucuya ek gidiş gelişlere neden olur. Sorgu Dizesi ve Form Değişkenlerini özgün istekten korumaz. Yeni yönlendirilen URL'yi tarayıcıda yönlendirildiği yerde görmenizi sağlar (ve gerekirse yer imi ekleyebilir). Tepki. Yönlendirme, (HTTP 302) tarayıcısına bir mesaj gönderir.
Server.Transfer Server.Transfer () adres çubuğunu değiştirmez, geri adım atamayız. Bazen "yükleme" türünde bir sayfada. Geçerli sayfa isteğini aynı sunucudaki başka bir .aspx sayfasına aktarır. Sunucu kaynaklarını korur ve sunucuya gereksiz gidiş gelişleri önler. Sorgu Dizesi ve Form Değişkenlerini (isteğe bağlı olarak) korur. Kullanıcıların Web Tarayıcısı'nda isteği yeniden yönlendirdiği gerçek URL'yi göstermez. Aktarım tarayıcı herhangi bir şey bilmeden gerçekleşir, tarayıcı bir sayfa ister, ancak sunucu başka bir sayfanın içeriğini döndürür.