WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

Response.Redirect("url", false)

by WebSurfer 2010年9月17日 09:44

以下のようにした場合、Next.aspx に遷移するのは、Response.Redirect メソッドが実行された時点でしょうか、それとも、「時間のかかる処理」が終わった後でしょうか?

protected void Button1_Click(object sender, EventArgs e)
{
  Response.Redirect("Next.aspx", false);
  // ・・・・・・・・
  // 時間のかかる処理
  // ・・・・・・・・
}

MSDN フォーラムで上記の質問があって、その時は前者だと勘違いしていたんですが、正しくは後者(正確には、それよりさらに後のリダイレクト後)でした。

Response.Redirect は、ブラウザに対して HTTP Response Code 302 と遷移先 (Location) の url を返します。それを受け取ったブラウザが指定された url を GET しに行くという仕組みになっています。

(詳しくは、.NET エンタープライズ Web アプリケーション 開発技術大全の ポストバック処理 の図 10 を見てください。)

従って、Web サーバーからコード 302 と遷移先 url 情報を含んだレスポンスが帰ってこないと、ブラウザは Next.aspx に遷移できないということになります。

Response.Redirect メソッドの第2引数を false にすると、上記コードの「時間のかかる処理」が全部終わらないことにはサーバーからレスポンスは返ってきません。

という訳で、上記の質問の答えは後者(「時間のかかる処理」が終わった後)になります。

処理にかかる時間が長いと、その間フリーズしたようになってしまい、ユーザビリティの面でうまくないですね。でも、自分が調べた限りですが、まずレスポンスを返して、その後処理を継続して完了させる方法はなさそうです。AJAX を利用してプログレスをユーザーに知らせることで対応するぐらいしか手はなさそうです。

以下は余談ですが・・・

Response.Redirect("url") または Response.Redirect("url", true) とした場合は、処理をその時点で中断して、即、ブラウザに HTTP Response Code 302 と遷移先 (Location) の url を返します。ただし、中断することによって ThreadAbortException が発生します。

Response.End、Response.Redirect、または Server.Transfer メソッドを使用した場合のそれは仕様だそうです。詳しくは、Microsoft Support の 文書番号: 312629 を見てください。

その文書に回避策も書いてあって、Response.Redirect の場合は第 2 引数を false にすることだそうです。でも、自分は回避策は取っていません。例外がスローされても、どうせ終了するスレッドなので何も問題はないと勝手に判断しています。本当にそれでいいのかという一抹の不安はありますが・・・(汗)

----- 2013/3/21 追記 -----

最近知ったのですが、.NET 4 以降の MSDN ライブラリの説明で、End メソッドの使用は非推奨になっています。理由は、End メソッドでスローされる ThreadAbortException がパフォーマンスに悪影響を及ぼすからだそうです。

HttpResponse.Redirect メソッド (String) は End を呼び出します。従って、このメソッドの代わりに、HttpResponse.Redirect(String, Boolean) オーバーロードを使用し、その Boolean の引数に false を渡し、CompleteRequest() メソッドを呼び出すことが推奨されています。

詳細は、MSDN ライブラリの HttpResponse.Redirect メソッド (String, Boolean) を参照してください。

Tags:

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar