Server.Transfer Vs. Response.Redirect


263

Arasındaki fark nedir Server.Transferve Response.Redirect?

  • Her birinin avantajları ve dezavantajları nelerdir?
  • Biri diğerine ne zaman uygundur?
  • Ne zaman uygun değildir?

3
Avantajlar ve dezavantajlar aşağıdaki sitede belirtilmiştir. developer.com/net/asp/article.php/3299641 Makaledeki ilginç bir nokta, Server.Transfer'ın Server.Redirect'e kıyasla daha fazla sunucu gücü tüketmesidir.
Ray Lu

Server.Transfer sayfa isteklerini azaltır, bu yüzden bu açıdan "daha iyi" olduğunu varsayalım. Ancak, Response.Redirect kullanıcıyı harici bir siteye gönderebilir, ancak Server.Transfer gönderemez.
2019

1
IIS 7 Tümleşik modunda çalışıyorsanız, Server.TransferRequestyerine kullanmayı düşünebilirsiniz Server.Transfer.
Haacked

@Haacked, başlangıçta Server.TransferRequest'in web matrisi ve iis7 ile sorunlarımı çözdüğünü okumalıydı. Gracias. Bunu buraya koymalılar.
Jason Sebring

Yanıtlar:


234

Response.Redirecttarayı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.


Bu, web matrisli CSHTML sayfalarıyla çalışır mı? Server.Transfer ("~ / somepage.cshtml", true) gibi bir CSHTML sayfasına bir Server.Transfer yaparken çalışmak için alamıyorum ama diğer sayfalar için çalışıyor gibi görünüyor. Evet ustura taktım ve sayfalar beklendiği gibi çalışıyor.
Jason Sebring

11
Hey öğrendim. Cshtml web matris sayfaları için Server.TransferRequest kullanmanız gerekir.
Jason Sebring

.Transfer () yalnızca fiziksel sayfalara aktarılıyor mu? örneğin. Server.Transfer'e ("default / category1.aspx") aktarırsam, içinde varsayılan bir klasör ve bir category1, aspx sayfası olması gerekir mi?
ihimv

95

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().


75

Kısa olması: Response.Redirecttarayıcıya başka bir sayfayı ziyaret etmesini söyler. Server.Transfersunucu 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.Transferkullanıcıyı benzer bir ifadeyle başka bir sayfaya göndermesi bakımından benzerdir Server.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.Transferkullanıcıyı harici bir siteye göndermek için kullanamazsınız . Response.RedirectBunu sadece yapabilir.

İkinci olarak, Server.Transferorijinal 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.TransferYöntemin ikinci bir parametresi de var - "preserveForm". Bunu olarak ayarlarsanız , varolan sorgu dizesi ve herhangi bir form değişkeni Truegibi bir ifade kullanarak Server.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").


10
Yorum için +1 + ancak bu, developer.com/net/asp/article.php/3299641 adresinden aynen kopyalanmış gibi görünüyor . Eğer başka bir kaynaktan geliyorsa, kiralamadan alıntı yapmalısınız.
Johnno Nolan

... ama kopyalamışlarsa sizden alıntı yapmalılar.
Johnno Nolan

7
Dedim ki: Bulduğum ve katıldığım bir şey;
TStamper

6
Kaynağa bağlanmalı ve kopyalanan parçalar için alıntı biçimlendirme / vurgulama kullanmalıdır.
Chris W. Rea

1
Nasıl maintaining the original URL... ...really help streamline data entry techniques?
JohnB

36

Response.Redirect() şu durumlarda kullanılmalıdır:

  • isteği sunucumuzdaki bazı düz HTML sayfalarına veya başka bir web sunucusuna yönlendirmek istiyoruz
  • her istekte sunucuya ek gidiş gelişlere neden olma umurumda değil
  • Sorgu Dizesi ve Form Değişkenlerini orijinal istekten korumamız gerekmez
  • kullanıcılarımızın tarayıcısında yönlendirildiği yeni yönlendirilmiş URL'yi görebilmelerini istiyoruz (ve gerekirse yer imlerine ekleyebiliriz)

Server.Transfer() şu durumlarda kullanılmalıdır:

  • geçerli sayfa isteğini aynı sunucudaki başka bir .aspx sayfasına aktarmak istiyoruz
  • sunucu kaynaklarını korumak ve sunucuya gereksiz gidiş gelişlerden kaçınmak istiyoruz
  • Sorgu Dizesi ve Form Değişkenlerini korumak istiyoruz (isteğe bağlı)
  • Web Tarayıcısı'nda isteği yeniden yönlendirdiğimiz gerçek URL'yi göstermemize gerek yok

2
Çok daha net, benim için bu kabul edilmiş bir cevap olarak daha iyi.
Baljeetsingh

28

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.


1
Kötü niyetli bir kullanıcı Response.Redirect, aradığım halde orijinal sayfayı yüklemek için atlayabilir Response.Redirectmi?
northben

@northben - Teknoloji söz konusu olduğunda "hayır" demek asla kolay değildir, çünkü neredeyse her şey tehlikeye girebilir - ama bu durumda nasıl olabilirler - hayır yapamazlar diyebilirim ... ama birçok kez yanlış kanıtlandım hayatta.
JonH

23

resim açıklamasını buraya girin

"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.

resim açıklamasını buraya girin

"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.

resim açıklamasını buraya girin

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.

resim açıklamasını buraya girin

Aşağıda, farkları ve hangi senaryoyu kullanacağını gösteren bir özet tablo bulunmaktadır.

resim açıklamasını buraya girin


Server.Transfer ve Response.Redirect kullanırken sorun olduğunda
kullanışlıdır

İçin Server.Transfer: aynı sunucu veya aynı IIS web sitesinde ?
Kiquenet

Nedeniyle benim düzenlemem için gerekli en az 6 karakter aşağıdaki paragraf güncellemek misiniz: "Response.Redirect" tarafından yürütülür iken başka deyişle "Server.Transfer" sunucu tarafından yürütülür thr tarayıcısı. "Response.Redirect" sayfanın yönlendirmesini yapmak için iki istek gerekiyor.
paul cheung

11

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.


10

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 ...


Bağlantı çalışmıyor. Bunun yerine bu web.archive.org bağlantısını kullanın.
stomi

6

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.


6

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");

5

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.


4

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.


4

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.


3

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


2

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: -

  1. İstemcide tarayıcı bir sayfa ister http: //InitiallyRequestedPage.aspx
  2. Sunucuda 302 http: //AnotherPage.aspx yönlendirme adresini ileterek isteğe yanıt verir .
  3. İstemcide tarayıcı http: //AnotherPage.aspx adresine ikinci bir istekte bulunur .
  4. Sunucuda http: //AnotherPage.aspx içeriğiyle yanıt verir

Server.Transfer: -

  1. İstemci tarayıcısında bir sayfa ister http: //InitiallyRequestedPage.aspx
  2. Sunucuda. Http: //AnotherPage.aspx adresine aktarın
  3. Sunucuda, http: //AnotherPage.aspx adresinden içerik aktarılması için http: //InitiallyRequestedPage.aspx isteğine yanıt verilir.

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.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.