Server.Transfer Vs. Response.Redirect


263

Was ist der Unterschied zwischen Server.Transferund Response.Redirect?

  • Was sind die Vor- und Nachteile der einzelnen?
  • Wann ist eins über das andere angemessen?
  • Wann ist man nicht angemessen?

3
Die Vor- und Nachteile sind auf der folgenden Website aufgeführt. developer.com/net/asp/article.php/3299641 Ein interessanter Punkt in diesem Artikel ist, dass Server.Transfer im Vergleich zu Server.Redirect mehr Serverleistung verbraucht.
Ray Lu

Server.Transfer reduziert Seitenanforderungen, daher ist es in dieser Hinsicht "besser". Response.Redirect kann den Benutzer jedoch an eine externe Site senden, Server.Transfer jedoch nicht.
CodeConcussion

1
Wenn Sie im integrierten IIS 7-Modus arbeiten, können Sie Server.TransferRequestanstelle von verwenden Server.Transfer.
Haacked

@ Haacked sollte gelesen haben, dass Server.TransferRequest am Anfang meine Probleme mit Webmatrix und iis7 gelöst hat. Gracias. Das sollten sie hier aufstellen.
Jason Sebring

Antworten:


234

Response.Redirectsendet einfach eine Nachricht (HTTP 302) an den Browser.

Server.Transfer Wenn der Browser nichts weiß, fordert der Browser eine Seite an, aber der Server gibt den Inhalt einer anderen Seite zurück.


Funktioniert dies mit CSHTML-Seiten mit Webmatrix? Ich kann es scheinbar nicht zum Laufen bringen, wenn ich einen Server.Transfer auf eine CSHTML-Seite wie Server.Transfer ("~ / somepage.cshtml", true) mache, aber es scheint für andere Seitentypen zu funktionieren. Ja, ich habe Rasiermesser installiert und die Seiten funktionieren wie erwartet.
Jason Sebring

11
Hey hat es herausgefunden. Sie müssen Server.TransferRequest für cshtml-Webmatrixseiten verwenden.
Jason Sebring

überträgt Server.Transfer () nur auf physische Seiten? für zB. Wenn ich zu Server.Transfer ("default / category1.aspx") übertrage, ist es dann erforderlich, einen Standardordner und eine Aspx-Seite der Kategorie 1 darin zu haben?
Ihimv

95

Response.Redirect()Sie werden auf eine neue Seite weitergeleitet, die Adressleiste aktualisiert und dem Browserverlauf hinzugefügt. In Ihrem Browser können Sie zurückklicken.

Server.Transfer()ändert die Adressleiste nicht. Sie können nicht zurückschlagen.

Ich benutze, Server.Transfer()wenn ich nicht möchte, dass der Benutzer sieht, wohin ich gehe. Manchmal auf einer Seite vom Typ "Laden".

Ansonsten werde ich immer verwenden Response.Redirect().


75

Um es kurz zu machen: Response.RedirectWeist den Browser einfach an, eine andere Seite zu besuchen. Server.TransferReduziert Serveranforderungen, behält die URL bei und ermöglicht es Ihnen mit ein wenig Bug-Bashing, die Abfragezeichenfolge und Formularvariablen zu übertragen.

Etwas, das ich gefunden habe und dem ich zustimme ( Quelle ):

Server.Transferist insofern ähnlich, als es den Benutzer mit einer Anweisung wie z Server.Transfer("WebForm2.aspx"). Die Aussage hat jedoch eine Reihe unterschiedlicher Vor- und Nachteile.

Erstens werden beim Übertragen auf eine andere Seite mit Server.Transfer Serverressourcen gespart. Anstatt den Browser anzuweisen, umzuleiten, ändert er einfach den "Fokus" auf dem Webserver und überträgt die Anforderung. Dies bedeutet, dass nicht so viele HTTP-Anforderungen eingehen, was den Druck auf Ihren Webserver verringert und die Ausführung Ihrer Anwendungen beschleunigt.

Aber Vorsicht: Der "Übertragungsprozess" kann nur auf den Sites ausgeführt werden, die auf dem Server ausgeführt werden. Sie können Server.Transferden Benutzer nicht an eine externe Site senden. Das Response.Redirectkann nur.

Zweitens wird Server.Transferdie ursprüngliche URL im Browser beibehalten. Dies kann wirklich dazu beitragen, die Dateneingabetechniken zu optimieren, kann jedoch beim Debuggen zu Verwirrung führen.

Das ist noch nicht alles: Die Server.TransferMethode hat auch einen zweiten Parameter - "erveForm ". Wenn Sie dies Truemithilfe einer Anweisung wie festlegen Server.Transfer("WebForm2.aspx", True), sind die vorhandene Abfragezeichenfolge und alle Formularvariablen für die Seite, auf die Sie übertragen, weiterhin verfügbar.

Wenn Ihre WebForm1.aspx beispielsweise über ein TextBox-Steuerelement mit dem Namen TextBox1 verfügt und Sie mit dem ParametererveForm auf True auf WebForm2.aspx übertragen haben, können Sie den Wert des TextBox-Steuerelements der Originalseite durch Verweisen abrufen Request.Form("TextBox1").


10
+1 für einen Kommentar, aber dieser scheint wörtlich von developer.com/net/asp/article.php/3299641 kopiert worden zu sein . Wenn es aus einer anderen Quelle stammt, sollten Sie es zumindest zitieren.
Johnno Nolan

... aber sie haben es kopiert, sie sollten dich zitieren.
Johnno Nolan

7
Ich sagte: Etwas, das ich gefunden habe und dem ich zustimme;
TStamper

6
Sollte auf die Quelle verlinken und die Formatierung / Hervorhebung von Zitaten für die kopierten Teile verwenden.
Chris W. Rea

1
Wie kann maintaining the original URL... ...really help streamline data entry techniques?
JohnB

36

Response.Redirect() sollte verwendet werden, wenn:

  • Wir möchten die Anfrage auf einige einfache HTML-Seiten auf unserem Server oder auf einen anderen Webserver umleiten
  • Es ist uns nicht wichtig, bei jeder Anfrage zusätzliche Roundtrips zum Server zu verursachen
  • Abfragezeichenfolgen und Formularvariablen müssen nicht aus der ursprünglichen Anforderung beibehalten werden
  • Wir möchten, dass unsere Benutzer die neue umgeleitete URL sehen können, unter der er in seinem Browser umgeleitet wird (und sie gegebenenfalls mit einem Lesezeichen versehen können).

Server.Transfer() sollte verwendet werden, wenn:

  • Wir möchten die aktuelle Seitenanforderung auf eine andere ASPX-Seite auf demselben Server übertragen
  • Wir möchten Serverressourcen schonen und unnötige Roundtrips zum Server vermeiden
  • Wir möchten Abfragezeichenfolgen und Formularvariablen (optional) beibehalten.
  • Wir müssen nicht die echte URL anzeigen, unter der wir die Anfrage im Webbrowser des Benutzers umgeleitet haben

2
Viel klarer, für mich ist dies besser als akzeptierte Antwort.
Baljeetsingh

28

Response.Redirect leitet die Seite auf eine andere Seite um, nachdem die erste Seite beim Client eingegangen ist. Der Kunde kennt also die Umleitung.

Server.Transfer beendet die aktuelle Ausführung der Seite. Der Client kennt die Umleitung nicht. Sie können die Abfragezeichenfolge und Formularvariablen übertragen.

Es hängt also von Ihren Bedürfnissen ab, welche besser ist.


1
Kann ein böswilliger Benutzer umgehen Response.Redirect, um die Originalseite zu laden, obwohl ich angerufen habe Response.Redirect?
Northben

@northben - Es ist nie einfach, "Nein" zu sagen, wenn es um Technologie geht, da fast alles kompromittiert werden kann - aber in diesem Fall wie könnten sie - ich würde sagen, nein, sie könnten nicht ... aber ich habe mich oft als falsch erwiesen im Leben.
JonH

23

Geben Sie hier die Bildbeschreibung ein

"response.redirect" und "server.transfer" helfen dabei, Benutzer von einer Seite auf eine andere Seite zu übertragen, während die Seite ausgeführt wird. Die Art und Weise, wie sie diese Übertragung / Umleitung durchführen, ist jedoch sehr unterschiedlich.

Für den Fall, dass Sie ein visueller Typ sind und eher eine Demonstration als eine Theorie sehen möchten, würde ich vorschlagen, das folgende Facebook-Video zu sehen, das den Unterschied auf demonstrativere Weise erklärt.

https://www.facebook.com/photo.php?v=762186150488997

Der Hauptunterschied zwischen ihnen besteht darin, wer die Übertragung durchführt. In "response.redirect" erfolgt die Übertragung durch den Browser, in "server.transfer" durch den Server. Versuchen wir, diese Aussage genauer zu verstehen.

In "Server.Transfer" ist die Reihenfolge der Übertragung wie folgt: -

1. Der Benutzer sendet eine Anforderung an eine ASP.NET-Seite. In der folgenden Abbildung wird die Anfrage an "WebForm1" gesendet und wir möchten zu "Webform2" navigieren.

2.Server startet die Ausführung von "Webform1" und der Lebenszyklus der Seite beginnt. Bevor jedoch der gesamte Lebenszyklus der Seite abgeschlossen ist, passiert "Server.transfer" mit "WebForm2".

3. Das Seitenobjekt "Webform2" wird erstellt, der gesamte Seitenlebenszyklus wird ausgeführt und die HTML-Antwort wird an den Browser gesendet.

Geben Sie hier die Bildbeschreibung ein

In "Response.Redirect" folgt die folgende Abfolge von Ereignissen für die Navigation: -

1.Client (Browser) sendet eine Anfrage an eine Seite. In der folgenden Abbildung wird die Anfrage an "WebForm1" gesendet und wir möchten zu "Webform2" navigieren.

2. Der Lebenszyklus von "Webform1" wird ausgeführt. Aber zwischen dem Lebenszyklus passiert "Response.Redirect".

3. Anstatt dass der Server eine Umleitung durchführt, sendet er einen HTTP 302-Befehl an den Browser. Dieser Befehl teilt dem Browser mit, dass er eine GET-Anforderung an die Seite "Webform2.aspx" initiieren muss.

4.Browser interpretiert den Befehl 302 und sendet eine GET-Anforderung für "Webform2.aspx".

Geben Sie hier die Bildbeschreibung ein

Mit anderen Worten, "Server.Transfer" wird vom Server ausgeführt, während "Response.Redirect" vom Browser ausgeführt wird. "Response.Redirect" benötigt zwei Anforderungen, um eine Umleitung der Seite durchzuführen.

Wann sollte "Server.Transfer" und wann "Response.Redirect" verwendet werden?

Verwenden Sie "Server.Transfer", wenn Sie durch Seiten navigieren möchten, die sich auf demselben Server befinden, und "Response.Redirect", wenn Sie zwischen Seiten navigieren möchten, die sich auf verschiedenen Servern und Domänen befinden.

Geben Sie hier die Bildbeschreibung ein

Nachfolgend finden Sie eine Übersichtstabelle, in der Unterschiede herausgearbeitet werden und in welchem ​​Szenario sie verwendet werden sollen.

Geben Sie hier die Bildbeschreibung ein


Nützlich bei Problemen mit Server.Transfer und Response.Redirect stackoverflow.com/questions/1433448/thread-was-being-aborted
Kiquenet

Für Server.Transfer: denselben Server oder dieselbe IIS-Website ?
Kiquenet

Mit anderen Worten : „Server.Transfer“ wird durch den Server ausgeführt wird, während „Response.Redirect“ durch ausgeführt wird: Könnten Sie bitte den folgenden Absatz wegen mindestens 6 Zeichen , die für meine bearbeiten aktualisieren thr Browser. "Response.Redirect" benötigt zwei Anforderungen, um eine Umleitung der Seite durchzuführen.
Paul Cheung

11

Das Schöne an Server.Transfer ist, was Sie damit machen können:

TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");

Mit der oben beschriebenen Methode können Sie alles von Ihrer vorherigen Seite abrufen, solange Sie Server.Transfer, aber nicht Response.Redirect verwenden


10

Zusätzlich zu ScarletGardens Kommentar müssen Sie auch die Auswirkungen von Suchmaschinen und Ihre Weiterleitung berücksichtigen. Hat sich diese Seite dauerhaft verschoben? Vorübergehend? Es macht einen Unterschied.

siehe: Response.Redirect vs. "301 Permanent verschoben" :

Wir haben alle Response.Redirect zu der einen oder anderen Zeit verwendet. Dies ist der schnelle und einfache Weg, um Besucher in die richtige Richtung zu lenken, wenn sie irgendwie am falschen Ort landen. Aber wussten Sie, dass Response.Redirect den HTTP-Antwortstatuscode "302 gefunden" sendet, wenn Sie wirklich "301 dauerhaft verschoben" senden möchten?

Der Unterschied scheint gering zu sein, aber in bestimmten Fällen kann er tatsächlich einen großen Unterschied machen. Wenn Sie beispielsweise den Antwortcode "301 dauerhaft verschoben" verwenden, entfernen die meisten Suchmaschinen den veralteten Link aus ihrem Index und ersetzen ihn durch den neuen. Wenn Sie "302 gefunden" verwenden, kehren sie weiterhin zur alten Seite zurück ...


Der Link funktioniert nicht. Verwenden Sie stattdessen diesen Link web.archive.org .
Stomy

6

Die Übertragung erfolgt vollständig serverseitig. Die Client-Adressleiste bleibt konstant. Einige Komplexität bei der Übertragung des Kontexts zwischen Anforderungen. Das Leeren und Neustarten von Seitenhandlern kann teuer sein. Führen Sie Ihre Übertragung daher frühzeitig durch, z. B. in einem HttpModule während BeginRequest. Lesen Sie die MSDN-Dokumente sorgfältig durch und testen und verstehen Sie die neuen Werte von HttpContext.Request - insbesondere in Postback-Szenarien. Wir verwenden normalerweise Server.Transfer für Fehlerszenarien.

Die Umleitung beendet die Anforderung mit einem 302-Status und einer clientseitigen Roundtrip-Antwort mit einer internen Ausnahme (geringfügiger Server-Perfektionstreffer - hängt davon ab, wie viele Sie pro Tag ausführen). Der Client navigiert dann zu einer neuen Adresse. Browser-Adressleiste & Verlaufsaktualisierungen usw. Der Kunde zahlt die Kosten für eine zusätzliche Hin- und Rückfahrt - die Kosten variieren je nach Latenz. In unserem Geschäft leiten wir viel um, wir haben unser eigenes Modul geschrieben, um die Ausnahmekosten zu vermeiden.


6

Es gibt viele Unterschiede wie oben angegeben. Abgesehen von vor allem gibt es noch einen Unterschied. Response.Redirect()kann verwendet werden, um Benutzer auf eine Seite umzuleiten, die nicht Teil der Anwendung ist, sondern Server.Transfer()nur, um Benutzer innerhalb der Anwendung umzuleiten.

//This will work.
Response.Redirect("http://www.google.com");

//This will not work.
Server.Transfer("http://www.google.com");

5

Response.Redirect ist teurer, da es dem Server eine zusätzliche Fahrt hinzufügt, um herauszufinden, wohin es gehen soll.

Server.Transfer ist effizienter, kann jedoch für den Benutzer ein wenig irreführend sein, da sich die URL nicht physisch ändert.

Nach meiner Erfahrung war der Leistungsunterschied nicht signifikant genug, um den letzteren Ansatz zu verwenden


4

Server.Transfer ändert die URL im Client-Browser nicht, sodass der Browser effektiv nicht weiß, dass Sie zu einem anderen serverseitigen Handler gewechselt haben. Response.Redirect weist den Browser an, zu einer anderen Seite zu wechseln, sodass sich die URL in der Titelleiste ändert.

Server.Transfer ist etwas schneller, da ein Roundtrip zum Server vermieden wird. Die Nichtänderung der URL kann jedoch entweder gut oder schlecht für Sie sein, je nachdem, was Sie tun möchten.


4

Response.Redirect: teilt dem Browser mit, dass die angeforderte Seite an einem neuen Speicherort gefunden werden kann. Der Browser initiiert dann eine weitere Anforderung an die neue Seite und lädt deren Inhalt in den Browser. Dies führt zu zwei Anfragen des Browsers.

Server.Transfer: Überträgt die Ausführung von der ersten Seite auf die zweite Seite des Servers. Der Browser-Client hat eine Anfrage gestellt und die erste Seite antwortet mit Inhalten. Der Vorteil dieses Ansatzes ist eine weniger Hin- und Rückfahrt vom Client-Browser zum Server. Außerdem sind auf der zweiten Seite alle veröffentlichten Formularvariablen und Abfragezeichenfolgenparameter verfügbar.


3

Nur mehr Details zu Transfer (), es ist eigentlich Server.Execute () + Response.End (), sein Quellcode ist unten (von Mono / .net 4.0):

public void Transfer (string path, bool preserveForm)
{
    this.Execute (path, null, preserveForm, true);
    this.context.Response.End ();
}

und für Execute () ist der Handler auszuführen des angegebenen Pfades, siehe

ASP.NET überprüft nicht, ob der aktuelle Benutzer berechtigt ist, die von der Execute- Methode bereitgestellte Ressource anzuzeigen . Obwohl die ASP.NET-Autorisierungs- und Authentifizierungslogik ausgeführt wird, bevor der ursprüngliche Ressourcenhandler aufgerufen wird, ruft ASP.NET den durch den angegebenen Handler direkt auf Execute- Methode und führt die Authentifizierungs- und Autorisierungslogik für die neue Ressource nicht erneut aus. Wenn die Sicherheitsrichtlinie Ihrer Anwendung erfordert, dass Clients über eine entsprechende Berechtigung für den Zugriff auf die Ressource verfügen, sollte die Anwendung eine erneute Autorisierung erzwingen oder einen benutzerdefinierten Zugriffssteuerungsmechanismus bereitstellen.

Sie können die erneute Autorisierung erzwingen, indem Sie die Redirect- Methode anstelle der Execute- Methode verwenden. Umleiten führt eine clientseitige Umleitung durch, bei der der Browser die neue Ressource anfordert. Da es sich bei dieser Umleitung um eine neue Anforderung handelt, die in das System eingeht, unterliegt sie der gesamten Authentifizierungs- und Autorisierungslogik sowohl der Internetinformationsdienste (IIS) als auch der ASP.NET-Sicherheitsrichtlinie.

- von MSDN


2

Response.Redirect beinhaltet eine zusätzliche Hin- und Rückfahrt und aktualisiert die Adressleiste.

Server.Transfer bewirkt keine Änderung der Adressleiste. Der Server antwortet auf die Anforderung mit Inhalten von einer anderen Seite

z.B

Response.Redirect: -

  1. Auf dem Client fordert der Browser eine Seite http: //InitiallyRequestedPage.aspx an
  2. Auf dem Server antwortet die Anfrage mit 302, indem die Umleitungsadresse http: //AnotherPage.aspx übergeben wird .
  3. Auf dem Client sendet der Browser eine zweite Anfrage an die Adresse http: //AnotherPage.aspx .
  4. Auf dem Server antwortet mit Inhalten von http: //AnotherPage.aspx

Server.Transfer: -

  1. Fordern Sie im Client-Browser eine Seite http: //InitiallyRequestedPage.aspx an
  2. Auf dem Server Server.Transfer to http: //AnotherPage.aspx
  3. Auf dem Server erfolgt die Antwort auf die Anforderung, dass http: //InitiallyRequestedPage.aspx Inhalte von http: //AnotherPage.aspx zurückgibt

Response.Redirect

Vorteile: - RESTful - Ändert die Adressleiste. Die Adresse kann verwendet werden, um Statusänderungen zwischen Anforderungen aufzuzeichnen.

Nachteile: - Langsam - Es gibt eine zusätzliche Hin- und Rückfahrt zwischen Client und Server. Dies kann teuer sein, wenn zwischen dem Client und dem Server eine erhebliche Latenz besteht.

Server.Transfer

Vorteile: - Schnell.

Nachteile: - Status verloren - Wenn Sie Server.Transfer verwenden, um den Status der Anwendung als Reaktion auf Post-Backs zu ändern. Wenn die Seite dann neu geladen wird, geht dieser Status verloren, da die Adressleiste dieselbe ist wie zuvor auf die erste Anfrage.


0

Response.Redirect Response.Redirect () sendet Sie zu einer neuen Seite, aktualisiert die Adressleiste und fügt sie dem Browserverlauf hinzu. In Ihrem Browser können Sie zurückklicken. Die Anfrage wird auf einige einfache HTML-Seiten auf unserem Server oder auf einen anderen Webserver umgeleitet. Bei jeder Anforderung werden zusätzliche Roundtrips zum Server ausgeführt. Abfragezeichenfolgen- und Formularvariablen aus der ursprünglichen Anforderung werden nicht beibehalten. Es ermöglicht die Anzeige der neuen umgeleiteten URL, unter der sie im Browser umgeleitet wird (und kann sie bei Bedarf mit einem Lesezeichen versehen). Antwort. Die Umleitung sendet einfach eine Nachricht an den Browser (HTTP 302).

Server.Transfer Server.Transfer () ändert die Adressleiste nicht, wir können nicht zurückschlagen. Man sollte Server.Transfer () verwenden, wenn der Benutzer nicht sehen soll, wohin er geht. Irgendwann auf einer Seite vom Typ "Laden". Es überträgt die aktuelle Seitenanforderung auf eine andere ASPX-Seite auf demselben Server. Es schont die Serverressourcen und vermeidet unnötige Roundtrips zum Server. Es werden Abfragezeichenfolgen- und Formularvariablen (optional) beibehalten. Es wird nicht die tatsächliche URL angezeigt, unter der die Anforderung im Webbrowser des Benutzers umgeleitet wird. Server.Transfer erfolgt, ohne dass der Browser etwas weiß. Der Browser fordert eine Seite an, aber der Server gibt den Inhalt einer anderen Seite zurück.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.