none
Response.Redirect("xxxx.aspx",False) の挙動に納得がいかないは間違い? RRS feed

  • 質問

  • 環境
    Windows Vista
    VS2008Std
    において,


        .... ボタンクリックなどのイベント
    {
        Response.Redirect("nextPage.aspx", False)
        // 適当に時間のかかるループ処理などを実行 ・・・・・ 処理1


    このような場合、先にnextPageが表示されてその後も元のページの処理が実行され続けると思っていたら、
    処理1の処理が終了してページ遷移するようですが私の勘違いでしょうか?

    • 編集済み ckumark 2009年6月26日 19:19 Fixing thread title bug
    2009年6月25日 10:07

回答

  • すみません、大いなる勘違いで、全くはずしたレスでした。改めて回答させてください。

    Response.Redirect は、ブラウザに対して HTTP Response Code 302 と遷移先 (Location) の URI 返
    すもので、それを受け取ったブラウザが指定された URI へと自動的に遷移 (GET) するという仕組みにな
    っているそうです。以下のページの図 10 を参照ください。(一応 HTTP ヘッダの Response Code が 302
    になっていて、Loation が指定した uri になっているのはパケットキャプチャーツールで確認しました)

    ポストバック処理
    http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp05/entwebapp05_04.html

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

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

    > 処理1の処理が終了してページ遷移するようですが私の勘違いでしょうか?

    は勘違いではなくて、そういう仕様ということのようです。

    • 回答としてマーク Jet2Jet 2009年6月26日 12:32
    2009年6月26日 11:34

すべての返信

  • > 処理1の処理が終了してページ遷移するようですが私の勘違いでしょうか?

    順序が違うと思います。false するとページが推移して、その後で処理が続行されるはずです。ture にすれば
    その後の処理はなされないはずです。以下のようなコードで試してみれば分かると思います。

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

        protected void btnUpload_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Default.aspx", false);
           
            if (!FileUpload1.HasFile)
            {
                return;
            }

            HttpPostedFile postedfile = FileUpload1.PostedFile;
            string fullFilename = postedfile.FileName;
            string filename = System.IO.Path.GetFileName(fullFilename);
            string mappedFilename = Page.Server.MapPath("~/FileUploadTest/" + filename);
            postedfile.SaveAs(mappedFilename);
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h2>ファイルのアップロードのテスト</h2>
            ファイル:<asp:FileUpload ID="FileUpload1" runat="server" /><br />
            <asp:Button ID="btnUpload" runat="server" Text="アップロード"
                onclick="btnUpload_Click"/>
        </div>
        </form>
    </body>
    </html>

    2009年6月25日 12:39
  • SurferOnWwwさん、早速ありがとうございます。

    >順序が違うと思います。false するとページが推移して、その後で処理が続行されるはずです。

    説明が悪かったでしょうか、それを期待したが違う動作をするという事を言いたかったのです。
    添付してもらったコードは試してませんが次のような事ですよね?

    1.ボタンをクリック。

    2.Default.aspxが表示される。

    3.元のページ(ボタンイベントのコード書かれたページ)の処理が継続中・・・

    私もそれを期待したのですが、実際はボタンをクリックしてから次のページ(上の例でいうDefault.aspx)が表示されるまで
    かなり時間がかかるのです。
    2009年6月25日 13:05
  • > 添付してもらったコードは試してませんが次のような事ですよね?

    試してみればいかがですか?
    2009年6月25日 13:12
  • SurferOnWwwさん

    ありがとう。
    2009年6月26日 0:04
  • すみません、大いなる勘違いで、全くはずしたレスでした。改めて回答させてください。

    Response.Redirect は、ブラウザに対して HTTP Response Code 302 と遷移先 (Location) の URI 返
    すもので、それを受け取ったブラウザが指定された URI へと自動的に遷移 (GET) するという仕組みにな
    っているそうです。以下のページの図 10 を参照ください。(一応 HTTP ヘッダの Response Code が 302
    になっていて、Loation が指定した uri になっているのはパケットキャプチャーツールで確認しました)

    ポストバック処理
    http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp05/entwebapp05_04.html

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

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

    > 処理1の処理が終了してページ遷移するようですが私の勘違いでしょうか?

    は勘違いではなくて、そういう仕様ということのようです。

    • 回答としてマーク Jet2Jet 2009年6月26日 12:32
    2009年6月26日 11:34
  • SuferOnWwwさん

    ご面倒おかけしました、ありがとうございます。
    2009年6月26日 12:35