Server.Transfer Vs. Response.Redirect

263

Quelle est la différence entre Server.Transferet Response.Redirect?

  • Quels sont les avantages et les inconvénients de chacun?
  • Quand l'un est-il approprié par rapport à l'autre?
  • Quand n'est-ce pas approprié?
kedar kamthe
la source
3
Les avantages et les inconvénients ont été mentionnés dans le site ci-dessous. developer.com/net/asp/article.php/3299641 Un point intéressant de l'article est que Server.Transfer consomme plus d'énergie par rapport à Server.Redirect.
Ray Lu
Server.Transfer réduit les demandes de pages, donc je suppose que c'est "mieux" à cet égard. Cependant, Response.Redirect peut envoyer l'utilisateur vers un site externe, contrairement à Server.Transfer.
codeConcussion
1
Si vous utilisez le mode intégré IIS 7, vous pouvez envisager d'utiliser Server.TransferRequestplutôt que Server.Transfer.
Hacké
@Haacked aurait dû lire qu'au début, Server.TransferRequest a résolu mes problèmes avec la matrice Web et iis7. Gracias. Ils devraient mettre ça ici.
Jason Sebring

Réponses:

234

Response.Redirectenvoie simplement un message (HTTP 302) au navigateur.

Server.Transfer se produit sans que le navigateur sache quoi que ce soit, le navigateur demande une page, mais le serveur renvoie le contenu d'un autre.

CMS
la source
Est-ce que cela fonctionne avec les pages CSHTML avec matrice Web? Je n'arrive pas à le faire fonctionner lorsque je fais un Server.Transfer vers une page CSHTML telle que Server.Transfer ("~ / somepage.cshtml", true) mais semble fonctionner pour d'autres types de pages. Oui, j'ai un rasoir installé et les pages fonctionnent comme prévu sinon.
Jason Sebring
11
Hey découvert. Vous devez utiliser Server.TransferRequest pour les pages de matrice Web cshtml.
Jason Sebring
Server.Transfer () ne transfère-t-il que vers des pages physiques? par exemple. si je transfère vers Server.Transfer ("default / category1.aspx"), est-il alors nécessaire d'avoir un dossier par défaut et une page category1, aspx dedans?
ihimv
95

Response.Redirect()vous enverra sur une nouvelle page, mettra à jour la barre d'adresse et l'ajoutera à l'historique du navigateur. Sur votre navigateur, vous pouvez cliquer en arrière.

Server.Transfer()ne modifie pas la barre d'adresse. Vous ne pouvez pas riposter.

J'utilise Server.Transfer()quand je ne veux pas que l'utilisateur voie où je vais. Parfois sur une page de type "chargement".

Sinon, je vais toujours utiliser Response.Redirect().

Christian Payne
la source
75

Pour être court: Response.Redirectdit simplement au navigateur de visiter une autre page.Server.Transferaide à réduire les demandes du serveur, maintient l'URL identique et, avec un peu de punition, vous permet de transférer la chaîne de requête et les variables de formulaire.

Quelque chose que j'ai trouvé et d'accord avec ( source ):

Server.Transferest similaire en ce qu'il envoie l'utilisateur vers une autre page avec une instruction telle que Server.Transfer("WebForm2.aspx"). Cependant, la déclaration présente un certain nombre d'avantages et d'inconvénients distincts.

Tout d'abord, le transfert vers une autre page en utilisant Server.Transfer les ressources du serveur conserve. Au lieu de dire au navigateur de rediriger, il modifie simplement le "focus" sur le serveur Web et transfère la demande. Cela signifie que vous n'obtenez pas autant de requêtes HTTP, ce qui réduit la pression sur votre serveur Web et accélère l'exécution de vos applications.

Mais attention: car le processus de "transfert" ne peut fonctionner que sur les sites fonctionnant sur le serveur; vous ne pouvez pas utiliser Server.Transferpour envoyer l'utilisateur vers un site externe. Seul Response.Redirectpeut le faire.

Deuxièmement, Server.Transferconserve l'URL d'origine dans le navigateur. Cela peut vraiment aider à rationaliser les techniques de saisie de données, même si cela peut prêter à confusion lors du débogage.

Ce n'est pas tout: la Server.Transferméthode a également un second paramètre: "preserveForm". Si vous le définissez sur True, à l'aide d'une instruction telle que Server.Transfer("WebForm2.aspx", True), la chaîne de requête existante et toutes les variables de formulaire seront toujours disponibles sur la page vers laquelle vous transférez.

Par exemple, si votre WebForm1.aspx a un contrôle TextBox appelé TextBox1 et que vous avez transféré vers WebForm2.aspx avec le paramètre preserveForm défini sur True, vous pourrez récupérer la valeur du contrôle TextBox de la page d'origine par référence Request.Form("TextBox1").

TStamper
la source
10
+1 pour le commentaire, mais cela semble copié mot pour mot à partir de developer.com/net/asp/article.php/3299641 . Si elle provient d'une autre source, vous devez au moins la citer.
Johnno Nolan
... mais ils l'ont copié, ils devraient vous citer.
Johnno Nolan
7
J'ai dit: quelque chose que j'ai trouvé et avec lequel je suis d'accord;
TStamper
6
Doit créer un lien vers la source et utiliser le formatage / surlignage des devis pour les pièces copiées.
Chris W. Rea
1
Comment maintaining the original URL... ...really help streamline data entry techniques?
JohnB
36

Response.Redirect() doit être utilisé lorsque:

  • nous voulons rediriger la demande vers des pages HTML simples sur notre serveur ou vers un autre serveur Web
  • nous ne nous soucions pas de provoquer des allers-retours supplémentaires sur le serveur à chaque demande
  • nous n'avons pas besoin de conserver la chaîne de requête et les variables de formulaire de la demande d'origine
  • nous voulons que nos utilisateurs puissent voir la nouvelle URL redirigée où il est redirigé dans son navigateur (et pouvoir la mettre en signet si nécessaire)

Server.Transfer() doit être utilisé lorsque:

  • nous voulons transférer la demande de page actuelle vers une autre page .aspx sur le même serveur
  • nous voulons préserver les ressources du serveur et éviter les allers-retours inutiles vers le serveur
  • nous voulons conserver la chaîne de requête et les variables de formulaire (facultativement)
  • nous n'avons pas besoin d'afficher l'URL réelle où nous avons redirigé la demande dans le navigateur Web de l'utilisateur
SoftDev
la source
2
Beaucoup plus clair, pour moi, c'est mieux comme réponse acceptée.
Baljeetsingh
28

Response.Redirect redirige la page vers une autre page après que la première page arrive au client. Le client connaît donc la redirection.

Server.Transfer quitte l'exécution en cours de la page. Le client ne connaît pas la redirection. Il vous permet de transférer la chaîne de requête et les variables de formulaire.

Cela dépend donc de vos besoins de choisir ce qui est le mieux.

Canavar
la source
1
Un utilisateur malveillant peut-il contourner Response.Redirectafin de charger la page d'origine même si j'ai appelé Response.Redirect?
northben
@northben - Il n'est jamais facile de dire «non» quand il s'agit de technologie car presque tout peut être compromis - mais dans ce cas, comment pourraient-ils - je dirais non, ils ne pourraient pas ... mais je me suis souvent trompé dans la vie.
JonH
23

entrez la description de l'image ici

"response.redirect" et "server.transfer" permettent de transférer l'utilisateur d'une page à une autre pendant l'exécution de la page. Mais la façon dont ils effectuent ce transfert / redirection est très différente.

Dans le cas où vous êtes un mec visuel et que vous aimeriez voir une démonstration plutôt qu'une théorie, je suggère de voir la vidéo facebook ci-dessous qui explique la différence de manière plus démonstrative.

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

La principale différence entre eux est de savoir qui effectue le transfert. Dans "response.redirect", le transfert est effectué par le navigateur tandis que dans "server.transfer", il est effectué par le serveur. Essayons de comprendre cette déclaration de manière plus détaillée.

Dans "Server.Transfer", voici la séquence du transfert: -

1.L'utilisateur envoie une demande à une page ASP.NET. Dans la figure ci-dessous, la demande est envoyée à "WebForm1" et nous aimerions naviguer vers "Webform2".

2. Le serveur commence à exécuter "Webform1" et le cycle de vie de la page démarre. Mais avant la fin du cycle de vie de la page, «Server.transfer» arrive à «WebForm2».

3. L'objet de page "Webform2" est créé, le cycle de vie complet de la page est exécuté et la réponse HTML de sortie est ensuite envoyée au navigateur.

entrez la description de l'image ici

Alors que dans "Response.Redirect" ce qui suit est la séquence d'événements pour la navigation: -

1.Le client (navigateur) envoie une demande à une page. Dans la figure ci-dessous, la demande est envoyée à "WebForm1" et nous aimerions naviguer vers "Webform2".

2.Le cycle de vie de "Webform1" commence à s'exécuter. Mais entre le cycle de vie "Response.Redirect" se produit.

Maintenant, plutôt que de faire une redirection par le serveur, il envoie une commande HTTP 302 au navigateur. Cette commande indique au navigateur qu'il doit lancer une demande GET sur la page "Webform2.aspx".

4.Browser interprète la commande 302 et envoie une demande GET pour "Webform2.aspx".

entrez la description de l'image ici

En d'autres termes, "Server.Transfer" est exécuté par le serveur tandis que "Response.Redirect" est exécuté par thr browser. "Response.Redirect" a besoin de deux requêtes pour faire une redirection de la page.

Alors, quand utiliser "Server.Transfer" et quand utiliser "Response.Redirect"?

Utilisez "Server.Transfer" lorsque vous souhaitez parcourir les pages qui résident sur le même serveur, utilisez "Response.Redirect" lorsque vous souhaitez naviguer entre les pages qui résident sur un serveur et un domaine différents.

entrez la description de l'image ici

Vous trouverez ci-dessous un tableau récapitulatif qui met en évidence les différences et dans quel scénario utiliser.

entrez la description de l'image ici

Shivprasad Koirala
la source
Utile lorsque des problèmes d'utilisation de Server.Transfer et Response.Redirect stackoverflow.com/questions/1433448/thread-was-being-aborted
Kiquenet
Pour Server.Transfer: le même serveur ou le même site Web IIS ?
Kiquenet
Pourriez-vous s'il vous plaît mettre à jour le paragraphe suivant en raison d'au moins 6 caractères requis pour ma modification: En d'autres termes, "Server.Transfer" est exécuté par le serveur tandis que "Response.Redirect" est exécuté par thr browser. "Response.Redirect" a besoin de deux requêtes pour faire une redirection de la page.
paul cheung
11

La beauté de Server.Transfer est ce que vous pouvez en faire:

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

Vous pouvez obtenir n'importe quoi de votre page précédente en utilisant la méthode ci-dessus tant que vous utilisez Server.Transfer mais pas Response.Redirect

Israël Margulies
la source
10

En plus du commentaire de ScarletGarden, vous devez également tenir compte de l'impact des moteurs de recherche et de votre redirection. Cette page a-t-elle été déplacée de façon permanente? Temporairement? Cela fait une différence.

voir: Response.Redirect vs "301 Moved Permanently" :

Nous avons tous utilisé Response.Redirect à un moment ou à un autre. C'est le moyen rapide et facile de diriger les visiteurs dans la bonne direction s'ils se retrouvent en quelque sorte au mauvais endroit. Mais saviez-vous que Response.Redirect envoie un code d'état de réponse HTTP "302 Trouvé" alors que vous voudriez vraiment envoyer "301 déplacé de façon permanente"?

La distinction semble petite, mais dans certains cas, elle peut réellement faire une grande différence. Par exemple, si vous utilisez un code de réponse "301 déplacé en permanence", la plupart des moteurs de recherche supprimeront le lien obsolète de leur index et le remplaceront par le nouveau. Si vous utilisez "302 Found", ils continueront de revenir à l'ancienne page ...

Diodée - James MacFarlane
la source
Le lien ne fonctionne pas. Utilisez plutôt ce lien web.archive.org .
stomie
6

Le transfert est entièrement côté serveur. La barre d'adresse client reste constante. Une certaine complexité concernant le transfert de contexte entre les requêtes. Le vidage et le redémarrage des gestionnaires de pages peuvent être coûteux, alors faites votre transfert tôt dans le pipeline, par exemple dans un HttpModule pendant BeginRequest. Lisez attentivement les documents MSDN et testez et comprenez les nouvelles valeurs de HttpContext.Request, en particulier dans les scénarios de publication. Nous utilisons généralement Server.Transfer pour les scénarios d'erreur.

La redirection met fin à la demande avec un état 302 et une réponse aller-retour côté client avec et mange en interne une exception (succès mineur du serveur - dépend du nombre que vous effectuez par jour) Le client navigue ensuite vers une nouvelle adresse. Barre d'adresse du navigateur et mises à jour de l'historique, etc. Le client paie le coût d'un aller-retour supplémentaire - le coût varie en fonction de la latence. Dans notre entreprise, nous redirigeons beaucoup, nous avons écrit notre propre module pour éviter le coût d'exception.

stephbu
la source
6

Il existe de nombreuses différences, comme indiqué ci-dessus. Hormis surtout, il y a encore une différence. Response.Redirect()peut être utilisé pour rediriger l'utilisateur vers n'importe quelle page qui ne fait pas partie de l'application mais Server.Transfer()ne peut être utilisée que pour rediriger l'utilisateur au sein de l'application.

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

//This will not work.
Server.Transfer("http://www.google.com");
Développeur Microsoft
la source
5

Response.Redirect est plus coûteux car il ajoute un voyage supplémentaire au serveur pour savoir où aller.

Server.Transfer est plus efficace mais il peut être un peu trompeur pour l'utilisateur car l'URL ne change pas physiquement.

D'après mon expérience, la différence de performances n'a pas été suffisamment importante pour utiliser cette dernière approche

deadbug
la source
4

Server.Transfer ne modifie pas l'URL dans le navigateur client, donc le navigateur ne sait pas que vous avez changé pour un autre gestionnaire côté serveur. Response.Redirect indique au navigateur de passer à une autre page, donc l'URL dans la barre de titre change.

Server.Transfer est légèrement plus rapide car il évite un aller-retour vers le serveur, mais le non-changement d'URL peut être bon ou mauvais pour vous, selon ce que vous essayez de faire.

krosenvold
la source
4

Response.Redirect: indique au navigateur que la page demandée peut être trouvée à un nouvel emplacement. Le navigateur lance ensuite une autre requête vers la nouvelle page en chargeant son contenu dans le navigateur. Il en résulte deux demandes par le navigateur.

Server.Transfer: il transfère l'exécution de la première page à la deuxième page sur le serveur. En ce qui concerne le client du navigateur, il a fait une demande et la page initiale est celle qui répond avec du contenu. L'avantage de cette approche est un aller-retour de moins vers le serveur à partir du navigateur client. En outre, toutes les variables de formulaire publiées et les paramètres de chaîne de requête sont également disponibles sur la deuxième page.

Nick Kahn
la source
3

Juste plus de détails sur Transfer (), c'est en fait Server.Execute () + Response.End (), son code source est ci-dessous (de Mono / .net 4.0):

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

et pour Execute (), ce que c'est que d'exécuter est le gestionnaire du chemin donné, voir

ASP.NET ne vérifie pas que l'utilisateur actuel est autorisé à afficher la ressource fournie par la méthode Execute . Bien que la logique d'autorisation et d'authentification ASP.NET s'exécute avant l'appel du gestionnaire de ressources d'origine, ASP.NET appelle directement le gestionnaire indiqué par Execute méthode et ne réexécute pas la logique d'authentification et d'autorisation pour la nouvelle ressource. Si la stratégie de sécurité de votre application nécessite que les clients disposent des autorisations appropriées pour accéder à la ressource, l'application doit forcer la nouvelle autorisation ou fournir un mécanisme de contrôle d'accès personnalisé.

Vous pouvez forcer une nouvelle autorisation en utilisant la méthode Redirect au lieu de la méthode Execute . La redirection effectue une redirection côté client dans laquelle le navigateur demande la nouvelle ressource. Étant donné que cette redirection est une nouvelle demande entrant dans le système, elle est soumise à toute la logique d'authentification et d'autorisation des stratégies de sécurité Internet Information Services (IIS) et ASP.NET.

- depuis MSDN

rockXrock
la source
2

Response.Redirect implique un aller-retour supplémentaire et met à jour la barre d'adresse.

Server.Transfer ne fait pas changer la barre d'adresse, le serveur répond à la demande avec le contenu d'une autre page

par exemple

Réponse.Redirect: -

  1. Sur le client, le navigateur demande une page http: //InitiallyRequestedPage.aspx
  2. Sur le serveur répond à la demande avec 302 en passant l'adresse de redirection http: //AnotherPage.aspx .
  3. Sur le client, le navigateur fait une deuxième demande à l'adresse http: //AnotherPage.aspx .
  4. Sur le serveur répond avec le contenu de http: //AnotherPage.aspx

Server.Transfer: -

  1. Sur le navigateur client demande une page http: //InitiallyRequestedPage.aspx
  2. Sur le serveur Server.Transfer vers http: //AnotherPage.aspx
  3. Sur le serveur, la réponse est faite à la demande de http: //InitiallyRequestedPage.aspx renvoyant le contenu de http: //AnotherPage.aspx

Response.Redirect

Avantages: - RESTful - Il change la barre d'adresse, l'adresse peut être utilisée pour enregistrer les changements d'état entre les demandes.

Inconvénients: - Lent - Il y a un aller-retour supplémentaire entre le client et le serveur. Cela peut être coûteux en cas de latence importante entre le client et le serveur.

Server.Transfer

Avantages: - Rapide.

Inconvénients: - État perdu - Si vous utilisez Server.Transfer pour changer l'état de l'application en réponse aux publications, si la page est ensuite rechargée, cet état sera perdu, car la barre d'adresse sera la même qu'elle était à la première demande.

Mick
la source
0

Response.Redirect Response.Redirect () vous enverra sur une nouvelle page, mettra à jour la barre d'adresse et l'ajoutera à l'historique du navigateur. Sur votre navigateur, vous pouvez cliquer en arrière. Il redirige la demande vers certaines pages HTML simples sur notre serveur ou vers un autre serveur Web. Il provoque des allers-retours supplémentaires vers le serveur à chaque demande. Il ne conserve pas la chaîne de requête et les variables de formulaire de la demande d'origine. Il permet de voir la nouvelle URL redirigée où elle est redirigée dans le navigateur (et de pouvoir la mettre en signet si nécessaire). Réponse. La redirection envoie simplement un message au navigateur (HTTP 302).

Server.Transfer Server.Transfer () ne modifie pas la barre d'adresse, nous ne pouvons pas riposter. On devrait utiliser Server.Transfer () quand il / elle ne veut pas que l'utilisateur voie où il va. Parfois sur une page de type "chargement". Il transfère la demande de page actuelle vers une autre page .aspx sur le même serveur. Il préserve les ressources du serveur et évite les allers-retours inutiles au serveur. Il conserve la chaîne de requête et les variables de formulaire (facultativement). Il ne montre pas l'URL réelle où il redirige la demande dans le navigateur Web de l'utilisateur. Server.Transfer se produit sans que le navigateur sache quoi que ce soit, le navigateur demande une page, mais le serveur renvoie le contenu d'une autre.

Shailendra Mishra
la source