web-dev-qa-db-ja.com

ASP.NET:Response.Redirect(...)の後のコードはどうなりますか?

Response.Redirect()により、現在実行中のメソッドが中止されますか?または、Response.Redirect()の後のコードも実行されますか?

(つまり、Response.Redirectの後にSubを返す/終了する必要がありますか?)

38
Brandon

これは完全な答えではないかもしれませんが、私が見たものから...

Response.Redirectは、実際にはSystem.Threading.ThreadAbortExceptionをスローすることにより、コードの実行を停止させます。

Global.Asaxでグローバルエラー処理を設定し、Response.Redirectをテストすることで、これを自分で確認できます。

編集

そしてここに私の答えをサポートするドキュメントへのリンクがあります:

リダイレクト呼び出しEndは、完了時にThreadAbortException例外を発生させます。

HttpResponse.Redirectメソッド(文字列、ブール値)(System.Web)

29
David

Response.Redirectには、Response.Redirectの呼び出しが応答を終了するであるかどうかを示すブール引数を受け入れるオーバーロードがあります。この引数なしでオーバーロードを呼び出すことは、応答を終了する必要があることを示すためにtrueを指定することと同じです。

応答の終了は、リダイレクトを発生させるために応答が変更された後にResponse.Endが呼び出され、Response.EndThreadAbortExceptionをスローして現在のモジュールを終了することを意味します。

Response.Redirectの呼び出し後のコードは、呼び出されません(追加の引数にfalseを指定しない限り)。実際には、finallyおよび特定のcatchハンドラーのコードは実行されますが、swallow a ThreadAbortExceptionは実行できません。

50

Response.Redirectには、endResponseという別のパラメーターがあります。コンテキストを正しく制御する必要があるため、try catchブロックでリダイレクトする場合は、falseに設定することをお勧めします。したがって、catchブロックは例外を取得します。

そのための注意点は、ページがキャンセル可能でない場合、制御を取得しようとしないことです。これの最も一般的なケースはGlobal.asaxです。したがって、そのコンテキストでこの例外について心配する必要はありません。信じられない場合は、このメソッドのコードを反映してみてください。

したがって、質問に答えるために、デフォルトでendResponseをtrueに設定した場合(つまり、ブール値をとらないメソッドで呼び出された場合)、Response.Redirectの後に多くのことを行う必要はありません。

3
Jon

私の理解では、Response.Redirect()を発行すると、それに続くコードは実行されません。あなたがそれについて考えるならば、それを実行しないことは理にかなっています。あなたは基本的にあなたがどこかに行きたいとあなたのコードに言っています。

例:マクドナルドでお得な食事を注文することと考えてください。あなたがそれを注文し、彼らがあなたの飲み物を満たし始めた後、あなたはあなたの考えを変えて、「あなたは何を知っている、私の注文を忘れてください。私はリダイレクトに行きますウェンディーズに自分自身。」その時点で、彼らはあなたのフライドポテトとハンバーガーを作るのをやめようとしています。なぜなら、まあ...あなたはどこかに行くことに決めたからです-つまり、応答をリダイレクトします。

1
MunkiPhD