Server.Transfer vs. Response.Redirect


263

Qual è la differenza tra Server.Transfere Response.Redirect?

  • Quali sono i vantaggi e gli svantaggi di ciascuno?
  • Quando è appropriato uno sopra l'altro?
  • Quando uno non è appropriato?

3
I vantaggi e gli svantaggi sono stati indicati nel sito seguente. developer.com/net/asp/article.php/3299641 Un punto interessante nell'articolo è che Server.Transfer consuma più potenza del server rispetto a Server.Redirect.
Ray Lu,

Server.Transfer riduce le richieste di pagine, quindi suppongo che sia "migliore" sotto questo aspetto. Tuttavia, Response.Redirect può inviare l'utente a un sito esterno mentre Server.Transfer no.
codeConcussion,

1
Se stai utilizzando la modalità integrata IIS 7, potresti prendere in considerazione l'uso Server.TransferRequestinvece di Server.Transfer.
Haacked,

@Haacked avrebbe dovuto leggere che all'inizio Server.TransferRequest ha risolto i miei problemi con la matrice web e iis7. Gracias. Dovrebbero metterlo qui.
Jason Sebring,

Risposte:


234

Response.Redirectinvia semplicemente un messaggio (HTTP 302) al browser.

Server.Transfer accade senza che il browser sappia nulla, il browser richiede una pagina, ma il server restituisce il contenuto di un'altra.


Funziona con le pagine CSHTML con matrice web? Non riesco a farlo funzionare quando si esegue un Server.Transfer su una pagina CSHTML come Server.Transfer ("~ / somepage.cshtml", true) ma sembra funzionare per altri tipi di pagine. Sì, ho installato il rasoio e le pagine funzionano come previsto altrimenti.
Jason Sebring,

11
Ehi scoperto. Devi usare Server.TransferRequest per le pagine della matrice web cshtml.
Jason Sebring,

Server.Transfer () trasferisce solo a pagine fisiche? per es. se trasferisco a Server.Transfer ("default / category1.aspx") allora è necessario avere una cartella predefinita e una categoria1, pagina aspx in essa?
ihimv,

95

Response.Redirect()ti invierà in una nuova pagina, aggiornerà la barra degli indirizzi e la aggiungerà alla cronologia del browser. Sul tuo browser puoi fare clic indietro.

Server.Transfer()non cambia la barra degli indirizzi. Non puoi rispondere.

Uso Server.Transfer()quando non voglio che l'utente veda dove sto andando. A volte su una pagina di tipo "caricamento".

Altrimenti userò sempre Response.Redirect().


75

Per essere breve: Response.Redirectdice semplicemente al browser di visitare un'altra pagina.Server.Transferaiuta a ridurre le richieste del server, mantiene lo stesso URL e, con un po 'di bug-bashing, consente di trasferire la stringa di query e le variabili del modulo.

Qualcosa che ho trovato e d'accordo con ( fonte ):

Server.Transfer è simile in quanto invia l'utente a un'altra pagina con una dichiarazione come Server.Transfer("WebForm2.aspx") . Tuttavia, la dichiarazione presenta una serie di vantaggi e svantaggi distinti.

Innanzitutto, trasferendo su un'altra pagina utilizzando Server.Transfer conserva le risorse del server. Invece di dire al browser di reindirizzare, cambia semplicemente il "focus" sul server Web e trasferisce la richiesta. Ciò significa che non ricevi molte richieste HTTP, il che riduce la pressione sul tuo server Web e rende le tue applicazioni più veloci.

Ma attenzione: perché il processo di "trasferimento" può funzionare solo su quei siti in esecuzione sul server; non è possibile utilizzare Server.Transferper inviare l'utente a un sito esterno. Solo Response.Redirectpuò farlo.

In secondo luogo, Server.Transfermantiene l'URL originale nel browser. Questo può davvero aiutare a semplificare le tecniche di immissione dei dati, sebbene possa creare confusione durante il debug.

Non è tutto: il Server.Transfermetodo ha anche un secondo parametro: "preservForm". Se lo imposti True, usando un'istruzione come Server.Transfer("WebForm2.aspx", True), la stringa di query esistente e qualsiasi variabile di modulo saranno ancora disponibili per la pagina in cui stai trasferendo.

Ad esempio, se WebForm1.aspx ha un controllo TextBox chiamato TextBox1 e si è trasferito su WebForm2.aspx con il parametro preservForm impostato su True, sarà possibile recuperare il valore del controllo TextBox della pagina originale facendo riferimento Request.Form("TextBox1").


10
+1 per un commento, ma questo sembra copiato letteralmente da developer.com/net/asp/article.php/3299641 . Se proviene da un'altra fonte, dovresti citarla a noleggio.
Johnno Nolan,

... ma l'hanno copiato dovrebbero citarti.
Johnno Nolan,

7
Ho detto: qualcosa che ho trovato e con cui sono d'accordo;
TStamper,

6
Dovrebbe essere collegato alla fonte e utilizzare la formattazione / evidenziazione delle quote per le parti copiate.
Chris W. Rea,

1
Come può maintaining the original URL... ...really help streamline data entry techniques?
John B

36

Response.Redirect() dovrebbe essere usato quando:

  • vogliamo reindirizzare la richiesta ad alcune semplici pagine HTML sul nostro server o ad altri server web
  • non ci importa di causare ulteriori roundtrip al server su ogni richiesta
  • non è necessario preservare la stringa di query e le variabili di modulo dalla richiesta originale
  • vogliamo che i nostri utenti siano in grado di vedere il nuovo URL reindirizzato dove viene reindirizzato nel suo browser (e di poterlo aggiungere ai segnalibri se necessario)

Server.Transfer() dovrebbe essere usato quando:

  • vogliamo trasferire la richiesta della pagina corrente a un'altra pagina aspx sullo stesso server
  • vogliamo preservare le risorse del server ed evitare i round trip inutili verso il server
  • vogliamo preservare la stringa di query e le variabili di modulo (facoltativamente)
  • non è necessario mostrare l'URL reale in cui abbiamo reindirizzato la richiesta nel browser Web degli utenti

2
Molto più chiaro, per me questo è meglio come una risposta accettata.
Baljeetsingh,

28

Response.Redirect reindirizza la pagina a un'altra pagina dopo l' arrivo della prima pagina al client. Quindi il client conosce il reindirizzamento.

Server.Transfer chiude l'esecuzione corrente della pagina. Il client non conosce il reindirizzamento. Ti consente di trasferire la stringa di query e le variabili del modulo.

Quindi dipende dalle tue esigenze scegliere quale sia meglio.


1
Un utente malintenzionato può ignorare in Response.Redirectmodo da caricare la pagina originale anche se ho chiamato Response.Redirect?
Northben,

@northben - Non è mai facile dire "no" quando si parla di tecnologia, dato che quasi tutto può essere compromesso - ma in questo caso come potrebbero - direi di no, non potevano ... ma mi è stato smentito molte volte nella vita.
JonH,

23

inserisci qui la descrizione dell'immagine

"response.redirect" e "server.transfer" aiutano a trasferire l'utente da una pagina all'altra mentre la pagina è in esecuzione. Ma il modo in cui effettuano questo trasferimento / reindirizzamento è molto diverso.

Nel caso in cui tu sia un tipo visivo e desideri vedere la dimostrazione piuttosto che la teoria, ti suggerirei di vedere il video di Facebook qui sotto che spiega la differenza in un modo più dimostrativo.

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

La differenza principale tra loro è chi effettua il trasferimento. In "response.redirect" il trasferimento viene eseguito dal browser mentre in "server.transfer" viene eseguito dal server. Proviamo a comprendere questa affermazione in modo più dettagliato.

In "Server.Transfer" di seguito è riportata la sequenza di come avviene il trasferimento: -

1. L'utente invia una richiesta a una pagina ASP.NET. Nella figura seguente la richiesta viene inviata a "WebForm1" e vorremmo passare a "Webform2".

2. Il server inizia a eseguire "Webform1" e inizia il ciclo di vita della pagina. Ma prima che il ciclo di vita completo della pagina sia completato "Server.transfer" accade a "WebForm2".

3. Viene creato l'oggetto pagina "Webform2", viene eseguito il ciclo di vita di pagina intera e la risposta HTML di output viene quindi inviata al browser.

inserisci qui la descrizione dell'immagine

In "Response.Redirect" di seguito è riportata la sequenza di eventi per la navigazione: -

1.Client (browser) invia una richiesta a una pagina. Nella figura seguente la richiesta viene inviata a "WebForm1" e vorremmo passare a "Webform2".

2. Il ciclo di vita di "Webform1" inizia l'esecuzione. Ma nel mezzo del ciclo di vita succede "Response.Redirect".

3.Ora invece che il server esegue un reindirizzamento, invia un comando HTTP 302 al browser. Questo comando indica al browser che deve avviare una richiesta GET alla pagina "Webform2.aspx".

4.Browser interpreta il comando 302 e invia una richiesta GET per "Webform2.aspx".

inserisci qui la descrizione dell'immagine

In altre parole "Server.Transfer" viene eseguito dal server mentre "Response.Redirect" viene eseguito dal browser. "Response.Redirect" ha bisogno di due richieste per eseguire un reindirizzamento della pagina.

Quindi, quando utilizzare "Server.Transfer" e quando utilizzare "Response.Redirect"?

Utilizzare "Server.Transfer" quando si desidera navigare tra le pagine che risiedono sullo stesso server, utilizzare "Response.Redirect" quando si desidera navigare tra pagine che risiedono su server e domini diversi.

inserisci qui la descrizione dell'immagine

Di seguito è riportata una tabella riepilogativa delle differenze che vengono individuate e dello scenario da utilizzare.

inserisci qui la descrizione dell'immagine


Problemi utile quando si utilizza Server.Transfer e Response.Redirect stackoverflow.com/questions/1433448/thread-was-being-aborted~~V~~plural~~3rd
Kiquenet

Per Server.Transfer: lo stesso server o lo stesso sito Web IIS ?
Kiquenet,

La prego di aggiornare il paragrafo seguente a causa di almeno 6 caratteri necessari per la mia modifica: in altre parole "server.Transfer" viene eseguita dal server mentre "Response.Redirect" viene eseguito dal thr browser. "Response.Redirect" ha bisogno di due richieste per eseguire un reindirizzamento della pagina.
Paul Cheung,

11

La bellezza di Server.Transfer è ciò che puoi farci:

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

Puoi ottenere qualsiasi cosa dalla tua pagina precedente utilizzando il metodo sopra finché si utilizza Server.Transfer ma non Response.Redirect


10

Oltre al commento di ScarletGarden, devi anche considerare l'impatto dei motori di ricerca e il tuo reindirizzamento. Questa pagina è stata spostata in modo permanente? Temporaneamente? Fa la differenza.

vedi: Response.Redirect vs. "301 spostato in modo permanente" :

Tutti abbiamo usato Response.Redirect prima o poi. È il modo semplice e veloce per far puntare i visitatori nella giusta direzione se in qualche modo finiscono nel posto sbagliato. Ma sapevi che Response.Redirect invia un codice di stato della risposta HTTP di "302 Found" quando potresti davvero voler inviare "301 Moved Permanently"?

La distinzione sembra piccola, ma in alcuni casi può effettivamente fare una grande differenza. Ad esempio, se si utilizza un codice di risposta "301 spostato in modo permanente", la maggior parte dei motori di ricerca rimuoverà il collegamento obsoleto dal proprio indice e lo sostituirà con quello nuovo. Se usi "302 trovati", continueranno a tornare alla vecchia pagina ...


Il collegamento non funziona. Usa invece questo link web.archive.org .
ventre

6

Il trasferimento è interamente lato server. La barra dell'indirizzo del client rimane costante. Qualche complessità sul trasferimento del contesto tra richieste. Lo svuotamento e il riavvio dei gestori di pagine può essere costoso, quindi eseguire il trasferimento all'inizio della pipeline, ad esempio in un HttpModule durante BeginRequest. Leggere attentamente i documenti MSDN e testare e comprendere i nuovi valori di HttpContext.Request, soprattutto negli scenari Postback. Di solito utilizziamo Server.Transfer per scenari di errore.

Il reindirizzamento termina la richiesta con uno stato 302 e una risposta di andata e ritorno sul lato client con e mangia internamente un'eccezione (hit hit del server minore - dipende da quante operazioni fai al giorno) Il client passa quindi al nuovo indirizzo. Barra degli indirizzi del browser e aggiornamenti della cronologia, ecc. Il cliente paga il costo di un viaggio di andata e ritorno extra - il costo varia a seconda della latenza. Nel nostro business reindirizziamo molto, abbiamo scritto il nostro modulo per evitare il costo dell'eccezione.


6

Ci sono molte differenze come sopra specificato. A parte soprattutto, c'è un'altra differenza. Response.Redirect()può essere utilizzato per reindirizzare l'utente a qualsiasi pagina che non fa parte dell'applicazione ma Server.Transfer()può essere utilizzato solo per reindirizzare l'utente all'interno dell'applicazione.

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

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

5

Response.Redirect è più costoso poiché aggiunge un ulteriore viaggio al server per capire dove andare.

Server.Transfer è più efficiente, tuttavia può essere un po 'fuorviante per l'utente poiché l'Url non cambia fisicamente.

Nella mia esperienza, la differenza di prestazioni non è stata abbastanza significativa da utilizzare quest'ultimo approccio


4

Server.Transfer non modifica l'URL nel browser client, quindi in realtà il browser non sa che è stato modificato in un altro gestore lato server. Response.Redirect indica al browser di passare a una pagina diversa, quindi l'URL nella barra del titolo cambia.

Server.Transfer è leggermente più veloce poiché evita un roundtrip al server, ma il non cambio di url può essere buono o cattivo per te, a seconda di ciò che stai cercando di fare.


4

Response.Redirect: indica al browser che la pagina richiesta può essere trovata in una nuova posizione. Il browser quindi avvia un'altra richiesta alla nuova pagina caricandone il contenuto nel browser. Ciò comporta due richieste da parte del browser.

Server.Transfer: trasferisce l'esecuzione dalla prima pagina alla seconda pagina sul server. Per quanto riguarda il client browser, ha fatto una richiesta e la pagina iniziale è quella che risponde con il contenuto. Il vantaggio di questo approccio è un viaggio di andata e ritorno in meno sul server dal browser client. Inoltre, tutte le variabili di modulo pubblicate e i parametri della stringa di query sono disponibili anche per la seconda pagina.


3

Solo maggiori dettagli su Transfer (), in realtà è Server.Execute () + Response.End (), il suo codice sorgente è sotto (da Mono / .net 4.0):

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

e per Execute (), ciò che deve essere eseguito è il gestore di un determinato percorso, vedi

ASP.NET non verifica che l'utente corrente sia autorizzato a visualizzare la risorsa fornita dal metodo Execute . Sebbene la logica di autorizzazione e autenticazione ASP.NET venga eseguita prima che venga chiamato il gestore risorse originale, ASP.NET chiama direttamente il gestore indicato dal metodo Execute e non riesegue la logica di autenticazione e autorizzazione per la nuova risorsa. Se la politica di sicurezza dell'applicazione richiede che i client dispongano dell'autorizzazione appropriata per accedere alla risorsa, l'applicazione deve forzare la nuova autorizzazione o fornire un meccanismo di controllo dell'accesso personalizzato.

È possibile forzare la riautorizzazione utilizzando il metodo di reindirizzamento anziché il metodo Execute . Il reindirizzamento esegue un reindirizzamento sul lato client in cui il browser richiede la nuova risorsa. Poiché questo reindirizzamento è una nuova richiesta che entra nel sistema, è soggetto a tutta la logica di autenticazione e autorizzazione di entrambi i criteri di sicurezza di Internet Information Services (IIS) e ASP.NET.

- da MSDN


2

Response.Redirect comporta un ulteriore round trip e aggiorna la barra degli indirizzi.

Server.Transfer non provoca la modifica della barra degli indirizzi, il server risponde alla richiesta con contenuto da un'altra pagina

per esempio

Response.Redirect: -

  1. Sul client il browser richiede una pagina http: //InitiallyRequestedPage.aspx
  2. Sul server risponde alla richiesta con 302 passando l'indirizzo di reindirizzamento http: //AnotherPage.aspx .
  3. Sul client il browser effettua una seconda richiesta all'indirizzo http: //AnotherPage.aspx .
  4. Sul server risponde con il contenuto di http: //AnotherPage.aspx

Server.Transfer: -

  1. Sul browser client richiede una pagina http: //InitiallyRequestedPage.aspx
  2. Sul server Server.Trasferire a http: //AnotherPage.aspx
  3. Sul server la risposta viene inviata alla richiesta di http: //InitiallyRequestedPage.aspx che restituisce il contenuto da http: //AnotherPage.aspx

Response.Redirect

Pro: - RESTful - Cambia la barra degli indirizzi, l'indirizzo può essere usato per registrare i cambiamenti di stato tra le richieste.

Contro: - Lento - Esiste un ulteriore round trip tra client e server. Questo può essere costoso quando esiste una latenza sostanziale tra il client e il server.

Server.Transfer

Pro: - Veloce.

Contro: - Stato perso - Se si utilizza Server.Transfer per modificare lo stato dell'applicazione in risposta ai postback, se la pagina viene ricaricata tale stato andrà perso, poiché la barra degli indirizzi sarà la stessa di prima alla prima richiesta.


0

Response.Redirect Response.Redirect () ti invierà a una nuova pagina, aggiornerà la barra degli indirizzi e la aggiungerà alla Cronologia del browser. Sul tuo browser puoi fare clic indietro. Reindirizza la richiesta ad alcune semplici pagine HTML sul nostro server o ad altri server web. Causa roundtrip aggiuntivi per il server su ogni richiesta. Non conserva le stringhe di query e le variabili di modulo dalla richiesta originale. Permette di vedere il nuovo URL reindirizzato dove viene reindirizzato nel browser (ed essere in grado di aggiungerlo ai segnalibri se necessario). Risposta. Il reindirizzamento invia semplicemente un messaggio al browser (HTTP 302).

Server.Transfer Server.Transfer () non cambia la barra degli indirizzi, non possiamo tornare indietro. Uno dovrebbe usare Server.Transfer () quando non vuole che l'utente veda dove sta andando. A volte in una pagina di tipo "caricamento". Trasferisce la richiesta di pagina corrente a un'altra pagina aspx sullo stesso server. Conserva le risorse del server ed evita i round trip inutili verso il server. Conserva le stringhe di query e le variabili di modulo (facoltativamente). Non mostra l'URL reale dove reindirizza la richiesta nel browser Web degli utenti. Server.Il trasferimento avviene senza che il browser sappia nulla, il browser richiede una pagina, ma il server restituisce il contenuto di un'altra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.