web-dev-qa-db-ja.com

Server.Transfer Vs. Response.Redirect

Server.TransferResponse.Redirectの違いは何ですか?

  • それぞれの長所と短所は何ですか?
  • 一方が他方に対して適切な場合
  • 適切でないのはいつですか?
257
kedar kamthe

Response.Redirectは、単にメッセージを送信します (HTTP 302) ブラウザーに。

Server.Transferは、ブラウザが何も知らずに発生し、ブラウザはページを要求しますが、サーバーは別のコンテンツを返します。

225
CMS

Response.Redirect()は、新しいページに移動し、アドレスバーを更新して、ブラウザー履歴に追加します。ブラウザで戻ることができます。

Server.Transfer()はアドレスバーを変更しません。反撃することはできません。

ユーザーに自分の行き先を見せたくないときはServer.Transfer()を使用します。 「ロード中」タイプのページ上にある場合があります。

それ以外の場合は、常にResponse.Redirect()を使用します。

90
Christian Payne

短くする:Response.Redirectは、ブラウザに別のページにアクセスするよう指示するだけです。 Server.Transferは、サーバーリクエストの削減に役立ち、URLを同じに保ち、少しバグバッシングを行うことで、クエリ文字列とフォーム変数を転送できます。

私が見つけて同意したもの( source ):

Server.Transferは、Server.Transfer("WebForm2.aspx")などのステートメントを使用してユーザーを別のページに送信するという点で似ています。ただし、このステートメントには多くの明確な利点と欠点があります。

まず、Server.Transferを使用して別のページに転送すると、サーバーリソースが節約されます。ブラウザにリダイレクトするように指示する代わりに、Webサーバー上の「フォーカス」を変更して、リクエストを転送するだけです。つまり、通過するHTTPリクエストの数がそれほど多くないため、Webサーバーへの負荷が軽減され、アプリケーションの実行速度が向上します。

ただし、注意してください。「転送」プロセスは、サーバーで実行されているサイトでのみ機能するためです。 Server.Transferを使用してユーザーを外部サイトに送信することはできません。 Response.Redirectのみがそれを行うことができます。

第二に、Server.Transferはブラウザの元のURLを保持します。これは、デバッグ時に混乱を招く可能性がありますが、データ入力技術の合理化に本当に役立ちます。

それだけではありません:Server.Transferメソッドには、2番目のパラメーター「preserveForm」もあります。これをTrueに設定すると、Server.Transfer("WebForm2.aspx", True)などのステートメントを使用して、既存のクエリ文字列とすべてのフォーム変数が、転送先のページで引き続き使用可能になります。

たとえば、WebForm1.aspxにTextBox1というTextBoxコントロールがあり、preserveFormパラメーターをTrueに設定してWebForm2.aspxに転送した場合、Request.Form("TextBox1")を参照して元のページのTextBoxコントロールの値を取得できます。

73
TStamper

Response.Redirect()は次の場合に使用する必要があります。

  • サーバー上のプレーンHTMLページまたは他のWebサーバーにリクエストをリダイレクトしたい
  • 各リクエストでサーバーへの追加の往復を引き起こすことは気にしません
  • 元のリクエストのクエリ文字列とフォーム変数を保持する必要はありません
  • ユーザーがブラウザでリダイレクトされた新しいリダイレクトURLを表示できるようにする(必要に応じてブックマークできるようにする)

Server.Transfer()は次の場合に使用する必要があります。

  • 現在のページリクエストを同じサーバー上の別の.aspxページに転送したい
  • サーバーリソースを保持し、サーバーへの不必要な往復を回避したい
  • クエリ文字列とフォーム変数を保持したい(オプション)
  • ユーザーのWebブラウザでリクエストをリダイレクトした実際のURLを表示する必要はありません。
31
SoftDev

Response.Redirectは、ページを別のページにリダイレクトしますafter最初のページがクライアントに到着します。したがって、クライアントはリダイレクトを知っています。

Server.Transferは、ページの現在の実行を終了します。クライアントはリダイレクトを知りません。クエリ文字列とフォーム変数を転送できます。

したがって、どちらが優れているかを選択する必要があります。

28
Canavar

enter image description here

「response.redirect」および「server.transfer」は、ページの実行中にユーザーをあるページから別のページに転送するのに役立ちます。ただし、この転送/リダイレクトの方法は非常に異なります。

あなたが視覚的な人であり、理論ではなくデモンストレーションをご覧になりたい場合は、より実証的な方法で違いを説明する以下のFacebookのビデオをご覧ください。

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

それらの主な違いは、誰が転送を行うかです。 「response.redirect」では、ブラウザが転送を行い、「server.transfer」では、サーバーが転送を行います。このステートメントをより詳細に理解してみましょう。

「Server.Transfer」では、転送がどのように行われるかを示しています。

1.ユーザーがASP.NETページにリクエストを送信します。次の図では、リクエストが「WebForm1」に送信され、「Webform2」に移動します。

2.サーバーは「Webform1」の実行を開始し、ページのライフサイクルが開始されます。しかし、ページの完全なライフサイクルが完了する前に、「Server.transfer」が「WebForm2」に発生します。

3.「Webform2」ページオブジェクトが作成され、ページ全体のライフサイクルが実行され、出力HTML応答がブラウザに送信されます。

enter image description here

「Response.Redirect」では、ナビゲーション用のイベントのシーケンスを次に示します。

1.クライアント(ブラウザ)はページにリクエストを送信します。次の図では、リクエストが「WebForm1」に送信され、「Webform2」に移動します。

2.「Webform1」のライフサイクルが実行を開始します。しかし、ライフサイクルの間に「Response.Redirect」が発生します。

3.サーバーがリダイレクトを行うのではなく、ブラウザにHTTP 302コマンドを送信します。このコマンドは、「Webform2.aspx」ページへのGET要求を開始する必要があることをブラウザーに伝えます。

4.Browserは302コマンドを解釈し、「Webform2.aspx」のGET要求を送信します。

enter image description here

つまり、「Server.Transfer」はサーバーによって実行され、「Response.Redirect」はthrブラウザーによって実行されます。 「Response.Redirect」は、ページのリダイレクトを行うために2つのリクエストが必要です。

「Server.Transfer」を使用する場合と「Response.Redirect」を使用する場合?

同じサーバーにあるページをナビゲートする場合は「Server.Transfer」を使用し、異なるサーバーとドメインにあるページ間をナビゲートする場合は「Response.Redirect」を使用します。

enter image description here

以下は、違いをチョークアウトし、どのシナリオで使用するかの概要表です。

enter image description here

21

Server.Transferの美しさは、それを使ってできることです。

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

Server.Transferを使用し、Response.Redirectを使用しない限り、上記の方法を使用して前のページから何でも取得できます。

11

ScarletGardenのコメントに加えて、検索エンジンとリダイレクトの影響も考慮する必要があります。このページは永久に移動しましたか?一時的に?違いが生まれます。

参照: Response.Redirect vs.「301 Moved Permanently」

Response.Redirectを使用したことがあります。訪問者が何らかの理由で間違った場所に来た場合に、訪問者を正しい方向に向けさせる迅速かつ簡単な方法です。しかし、本当に「301 Moved Permanently」を送信したい場合、Response.RedirectがHTTP応答ステータスコード「302 Found」を送信することをご存知ですか?

違いは小さいように見えますが、場合によっては実際に大きな違いを生むことができます。たとえば、「301 Moved Permanently」応答コードを使用すると、ほとんどの検索エンジンはインデックスから古いリンクを削除し、新しいリンクに置き換えます。 「302 Found」を使用すると、引き続き古いページに戻ります...

転送は完全にサーバー側です。クライアントのアドレスバーは一定のままです。リクエスト間のコンテキストの転送に関する複雑さ。ページハンドラーのフラッシュと再起動は高価になる可能性があるため、パイプラインの早い段階で転送を行います。 BeginRequest中のHttpModuleで。 MSDNのドキュメントを注意深く読み、HttpContext.Requestの新しい値をテストして理解してください(特にポストバックシナリオの場合)。通常、エラーシナリオにはServer.Transferを使用します。

リダイレクトは、302ステータスでリクエストを終了し、クライアント側のラウンドトリップレスポンスで例外を内部的に処理します(マイナーサーバーパフォーマンスヒット-1日の実行回数に依存します)。その後、クライアントは新しいアドレスに移動します。ブラウザのアドレスバーや履歴の更新など。クライアントは追加の往復費用を支払います。費用は待ち時間によって異なります。私たちのビジネスでは、リダイレクトコストを回避するためにalot独自のモジュールを作成しました。

6
stephbu

上記のように多くの違いがあります。とりわけ、もう1つの違いがあります。 Response.Redirect()は、アプリケーションの一部ではないページにユーザーをリダイレクトするために使用できますが、Server.Transfer()はアプリケーション内のユーザーをリダイレクトするためにのみ使用できます。

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

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

Response.Redirectは、移動先を見つけるためにサーバーに余分な旅行を追加するため、よりコストがかかります。

Server.Transferはより効率的ですが、Urlが物理的に変更されないため、ユーザーを少し誤解させる可能性があります。

私の経験では、パフォーマンスの違いは後者のアプローチを使用するほど重要ではありませんでした

5
deadbug

Response.Redirect:は、要求されたページが新しい場所にあることをブラウザに伝えます。その後、ブラウザは新しいページに対して別のリクエストを開始し、ブラウザにコンテンツをロードします。これにより、ブラウザーによる2つの要求が発生します。

Server.Transfer:サーバーの最初のページから2番目のページに実行を転送します。ブラウザークライアントに関する限り、それは1つの要求を行い、最初のページはコンテンツで応答するページです。このアプローチの利点は、クライアントブラウザーからサーバーへのラウンドトリップが1つ少ないことです。また、投稿されたフォーム変数とクエリ文字列パラメーターは、2番目のページでも使用できます。

4
Nick Kahn

Server.TransferはクライアントブラウザーのURLを変更しないため、事実上、ブラウザーは別のサーバー側ハンドラーに変更したことを認識しません。 Response.Redirectは、ブラウザに別のページに移動するように指示するため、タイトルバーのURLが変更されます。

Server.Transferはサーバーへの1回の往復を回避するため、わずかに高速になりますが、URLを変更しないことは、何をしようとしているかに応じて、良いことも悪いこともあります。

4
krosenvold

Transfer()の詳細は、実際にはServer.Execute()+ Response.End()です。そのソースコードは(Mono/.net 4.0以降)です。

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

execute()の場合、実行されるのは、指定されたパスのhandlerです。

ASP.NETは、現在のユーザーがExecuteメソッドによって配信されるリソースを表示する権限を持っていることを確認しません。元のリソースハンドラーが呼び出される前にASP.NETの承認および認証ロジックが実行されますが、ASP.NETはExecuteメソッドによって示されるハンドラーを直接呼び出し、認証および承認ロジックを再実行しません新しいリソース用。アプリケーションのセキュリティポリシーで、クライアントがリソースにアクセスするための適切な承認を必要とする場合、アプリケーションは再承認を強制するか、カスタムアクセス制御メカニズムを提供する必要があります。

Executeメソッドの代わりにRedirectメソッドを使用して、再認証を強制することができます。 Redirectは、ブラウザが新しいリソースを要求するクライアント側のリダイレクトを実行します。このリダイレクトはシステムに入る新しい要求であるため、インターネットインフォメーションサービス(IIS)とASP.NETセキュリティポリシーの両方のすべての認証および承認ロジックの対象となります。

- MSDNから

3
rockXrock

Response.Redirectは余分な往復を伴い、アドレスバーを更新します。

Server.Transferはアドレスバーを変更せず、サーバーは別のページのコンテンツでリクエストに応答します

例えば.

Response.Redirect:-

  1. クライアントでは、ブラウザがページをリクエストします http://InitiallyRequestedPage.aspx
  2. サーバーでは、302でリダイレクトアドレスを渡してリクエストに応答します http://AnotherPage.aspx
  3. クライアントでは、ブラウザはアドレスに2番目のリクエストを行います http://AnotherPage.aspx
  4. サーバーで http://AnotherPage.aspx からのコンテンツで応答します

Server.Transfer:-

  1. クライアントブラウザーでページをリクエスト http://InitiallyRequestedPage.aspx
  2. サーバーでServer.Transfer to http://AnotherPage.aspx
  3. サーバーでは、 http://InitiallyRequestedPage.aspx からのリクエストへの応答が行われます- http://AnotherPage.aspx からコンテンツを返します

Response.Redirect

長所:-RESTful-アドレスバーを変更します。アドレスはリクエスト間の状態の変化を記録するために使用できます。

短所:-遅い-クライアントとサーバー間に余分な往復があります。これは、クライアントとサーバーの間にかなりの遅延がある場合に高価になる可能性があります。

Server.Transfer

長所:-クイック。

短所:-State lost-ポストバックに応じてServer.Transferを使用してアプリケーションの状態を変更している場合、ページがリロードされるとその状態は失われます、アドレスバーは最初のリクエストと同じになるためです。

1
Mick

Response.Redirect Response.Redirect()は、新しいページに移動し、アドレスバーを更新して、ブラウザー履歴に追加します。ブラウザで戻ることができます。サーバー上のいくつかのプレーンなHTMLページまたは他のWebサーバーにリクエストをリダイレクトします。各リクエストでサーバーへの追加の往復を引き起こします。元のリクエストのクエリ文字列とフォーム変数は保持されません。ブラウザでリダイレクトされる新しいリダイレクトURLを表示できます(必要に応じてブックマークすることもできます)。応答。リダイレクトは、メッセージを(HTTP 302)ブラウザーに送信するだけです。

Server.Transfer Server.Transfer()はアドレスバーを変更しないため、元に戻せません。ユーザーに自分がどこにいるかを見せたくない場合は、Server.Transfer()を使用する必要があります。行く。いつか「ロード」タイプのページで。現在のページ要求を同じサーバー上の別の.aspxページに転送します。サーバーリソースを保持し、サーバーへの不必要なラウンドトリップを回避します。クエリ文字列とフォーム変数を保持します(オプション)。ユーザーのWebブラウザーでリクエストをリダイレクトする実際のURLは表示されません。 Server.Transferは、ブラウザが何も知らずに発生し、ブラウザはページを要求しますが、サーバーは別のコンテンツを返します。

0