web-dev-qa-db-fra.com

Vs Server.Transfer Response.Redirect

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

  • Quels sont les avantages et les inconvénients de chacun?
  • Quand l'un est-il approprié à l'autre?
  • Quand ne convient-on pas?
258
kedar kamthe

Response.Redirect envoie simplement un message (HTTP 302) au navigateur.

Server.Transfer se passe sans que le navigateur ne sache rien, le navigateur demande une page, mais le serveur renvoie le contenu d'une autre.

226
CMS

Response.Redirect() vous enverra vers 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() lorsque 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().

91
Christian Payne

Pour être bref: Response.Redirect indique simplement au navigateur de visiter une autre page. Server.Transfer permet de réduire le nombre de requêtes du serveur, de conserver l'URL identique et, moyennant un petit bogue, de transférer la chaîne de requête et les variables de formulaire.

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

Server.Transfer est similaire en ce sens qu'il envoie l'utilisateur à 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.

Tout d'abord, le transfert vers une autre page à l'aide de Server.Transfer préserve les ressources du serveur. Au lieu de dire au navigateur de rediriger, il change simplement le "focus" sur le serveur Web et transfère la requête. Cela signifie que vous recevez moins de requêtes HTTP, ce qui allège la pression sur votre serveur Web et accélère l'exécution de vos applications.

Mais attention: le processus de "transfert" ne peut fonctionner que sur les sites exécutés sur le serveur; vous ne pouvez pas utiliser Server.Transfer pour envoyer l'utilisateur sur un site externe. Seul Response.Redirect peut le faire.

Deuxièmement, Server.Transfer conserve l'URL d'origine dans le navigateur. Cela peut vraiment aider à rationaliser les techniques de saisie de données, bien que cela puisse créer une confusion lors du débogage.

Ce n'est pas tout: la méthode Server.Transfer possède également un deuxième paramètre, "preserveForm". Si vous définissez ceci 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 resteront disponibles pour la page vers laquelle vous effectuez le transfert.

Par exemple, si votre WebForm1.aspx a un contrôle TextBox appelé TextBox1 et que vous avez été transféré à WebForm2.aspx avec le paramètre preserveForm défini sur True, vous pourrez extraire la valeur du contrôle TextBox de la page d'origine en référençant Request.Form("TextBox1").

73
TStamper

Response.Redirect() devrait ê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 vers le serveur à chaque demande
  • nous n'avons pas besoin de préserver 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 vers laquelle il est redirigé dans son navigateur (et pouvoir la marquer si nécessaire)

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

  • nous voulons transférer la demande de page en cours à 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 préserver la chaîne de requête et les variables de formulaire (éventuellement)
  • nous n'avons pas besoin de montrer l'URL réelle où nous avons redirigé la demande dans le navigateur Web des utilisateurs
32
SoftDev

Response.Redirect redirige la page vers une autre page après la première page arrive au client. Donc, le client connaît 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 pour choisir le meilleur.

28
Canavar

enter image description here

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

Au cas où vous êtes un mec visuel et aimeriez voir une démonstration plutôt que de la théorie, je suggérerais de voir la vidéo ci-dessous sur Facebook 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 qui fait le transfert. Dans "response.redirect", le transfert est effectué par le navigateur, alors 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", vous trouverez ci-dessous 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 souhaitons naviguer vers "Webform2".

2. Le serveur commence à exécuter "Webform1" et le cycle de vie de la page commence. Mais avant que le cycle de vie complet de la page soit terminé, "Server.transfer" passe à "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 en sortie est ensuite envoyée au navigateur.

enter image description here

Dans "Response.Redirect", la séquence d'événements pour la navigation est la suivante: -

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

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

3.Maintenant que le serveur effectue une redirection, il envoie une commande HTTP 302 au navigateur. Cette commande indique au navigateur qu'il doit lancer une requête GET vers la page "Webform2.aspx".

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

enter image description here

En d'autres termes, "Server.Transfer" est exécuté par le serveur tandis que "Response.Redirect" est exécuté par le navigateur. "Response.Redirect" a besoin de deux demandes pour rediriger la page.

Quand utiliser "Server.Transfer" et "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 différents serveurs et domaines.

enter image description here

Vous trouverez ci-dessous un tableau récapitulatif présentant les différences et le scénario à utiliser.

enter image description here

21

La beauté de Server.Transfer, c’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

11
Israel Margulies

En plus du commentaire de ScarletGarden, vous devez également prendre en compte 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 déplacés en permanence" :

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 au mauvais endroit. Mais saviez-vous que Response.Redirect envoie un code d’état de réponse HTTP de "302 trouvés" alors que vous souhaitez réellement envoyer "301 déplacés de façon permanente"?

La distinction semble petite, mais dans certains cas, elle peut réellement faire la différence. Par exemple, si vous utilisez un code de réponse "301 déplacés 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 trouvés", ils continueront à revenir à l'ancienne page ...

Le transfert s'effectue entièrement côté serveur. La barre d'adresse du client reste constante. Une certaine complexité concernant le transfert de contexte entre les demandes. Le rinçage et le redémarrage des gestionnaires de pages peuvent être coûteux, alors effectuez votre transfert tôt dans le processus, par exemple. dans un HttpModule pendant BeginRequest. Lisez attentivement la documentation MSDN, testez et comprenez les nouvelles valeurs de HttpContext.Request, en particulier dans les scénarios de post-publication. Nous utilisons généralement Server.Transfer pour les scénarios d'erreur.

La redirection termine la demande avec un statut 302 et une réponse aller-retour côté client avec et mange en interne une exception (performances du serveur mineures - dépend du nombre de fois que vous en faites par jour). Le client navigue ensuite vers la nouvelle adresse. La barre d'adresse du navigateur et les 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 les coûts d’exception.

6
stephbu

Il y a beaucoup de différences comme spécifié ci-dessus. En dehors de tout, il y a encore une différence. Response.Redirect() peut être utilisé pour rediriger l'utilisateur vers une page ne faisant pas partie de l'application, mais Server.Transfer() ne peut être utilisé 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");
5

Response.Redirect est plus coûteux, car il ajoute un déplacement supplémentaire au serveur pour déterminer où aller.

Server.Transfer est plus efficace mais il peut être un peu déroutant pour l'utilisateur puisque l'URL ne change pas physiquement.

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

5
deadbug

Response.Redirect: indique au navigateur que la page demandée peut être trouvée à un nouvel emplacement. Le navigateur lance ensuite une autre demande à la nouvelle page en chargeant son contenu dans le navigateur. Cela entraîne deux demandes du 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 le contenu. L'avantage de cette approche est un trajet aller-retour de moins vers le serveur à partir du navigateur client. En outre, toutes les variables de formulaire et les paramètres de chaîne de requête publiés sont également disponibles sur la deuxième page.

4
Nick Kahn

Server.Transfer ne modifie pas l'URL dans le navigateur client. Par conséquent, 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 afin que l'URL de la barre de titre change.

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

4
krosenvold

Juste plus de détails sur Transfer (), il s’agit en fait de Server.Execute () + Response.End (), son code source est ci-dessous (à partir 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 qu’il faut 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 la méthode Execute 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 la réautorisation en utilisant la méthode Redirect au lieu de la méthode Execute . Redirect effectue une redirection côté client dans laquelle le navigateur demande la nouvelle ressource. Comme cette redirection est une nouvelle demande entrant dans le système, elle est soumise à toute la logique d'authentification et d'autorisation de la stratégie de sécurité Internet Information Services (IIS) et ASP.NET.

- de MSDN

3
rockXrock

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

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

par exemple.

Response.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 effectue une seconde 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 du client demande une page http: //InitiallyRequestedPage.aspx
  2. Sur le serveur Server.Transfer to http: //AnotherPage.aspx
  3. Sur le serveur, la réponse est faite à la demande de http: //InitiallyRequestedPage.aspx en renvoyant le contenu de http: //AnotherPage.aspx

Response.Redirect

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

Inconvénients: - Lent - Il existe un aller-retour supplémentaire entre le client et le serveur. Cela peut être coûteux lorsqu'il existe une latence importante entre le client et le serveur.

Server.Transfer

Avantages: - Rapide.

Inconvénients: - Etat perdu - Si vous utilisez Server.Transfer pour modifier l'état de l'application en réponse à la publication, si la page est rechargée, cet état sera perdu. , car la barre d’adresse sera la même que lors de la première demande.

1
Mick

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

Server.Transfer Server.Transfer () ne change pas la barre d'adresse, nous ne pouvons pas riposter. On doit utiliser Server.Transfer () lorsqu'il ne veut pas que l'utilisateur voie où il se trouve. Aller. Parfois sur une page de type "chargement". Il transfère la demande de page en cours 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 préserve la chaîne de requête et les variables de formulaire (facultatif). Il n’affiche pas l’URL réelle où il redirige la demande dans le navigateur Web de l’utilisateur. Server.Transfer se passe sans que le navigateur sache rien, le navigateur demande une page, mais le serveur renvoie le contenu d'une autre.

0
Shailendra Mishra