none
ファイルダウンロード時のResponse.End() と Response.Close() の使い分けについて RRS feed

  • 質問

  • ファイルダウンロード処理を作成しています。
    この処理を作成する場合、最後にResponse.End() か Response.Close() でダウンロード実行させると思います。
    どちらでもダウンロードは可能であることは確認できました。

    疑問としてはResponse.End() と Response.Close() のどちらを利用したほうが良いのでしょうか。
    私が認識しているデメリットとしては、
     ・Response.End() 
       ThreadAbortException 例外が発生する。
     ・Response.Close()
       ソケットが切断されるため、Close後のResponse関連メソッドが利用できない。
    です。

    私が認識している以外にもメリット、デメリットがありましたら教えて頂けないでしょうか。

    以上です。
    宜しくお願い致します。
    井上 達夫
    2009年2月13日 2:37

回答

  • 自信がないけど1つ思いついたことを。
    その前に、クラス名を書いてほしいです。.NET FrameworkでEnd()メソッドを持つもの+話題から推測してHttpResponseクラスであっていますか?

    HttpResponseクラスのサンプルなどはEnd()もClose()もせず、Flush()だけしています。
    事前にサイズがわかっている場合、Content-Lengthヘッダを指定するとWebサーバ・ブラウザ共に幸せになれます。
    • 回答としてマーク sk7474 2009年2月24日 9:37
    2009年2月13日 10:55
  •  

    目的は、バッファリングされているすべての出力をクライアントへ送信する
    ことでしょうから、End または Flush が正解だと思います。

    HttpResponse.BufferOutput プロパティはデフォルトで true になっている
    そうですし。

    確かに End の場合、VWD 2008 Express を使い始めたころ、[デバッグ開始]
    で実行すると、ThreadAbortException が throw されるというのは自分も経
    験しました。(VS2008 Pro では同じコードなのに何故だか出ない。理由は調
    べきれてません)。

    そのとき例外が出る条件を調べたところ、Mdsn ライブラリに以下のことが書
    いてありました。

    "スレッドを破棄するために Abort メソッドが呼び出されるときに、共通言
    語ランタイムは ThreadAbortException をスローします。"

    "End メソッド、Redirect メソッドおよび Transfer メソッドの呼び出しで、
    現在の応答が途中で終了すると、ThreadAbortException 例外がスローされま
    す。"

    自分は、気になったので Flush に変えました。

    ただ、End で例外がスローされても、それをハンドルしていなくても何も問
    題は出ないので、実際は気にする必要はないのかもしれません。

    答えになってませんね。(笑)

    • 回答としてマーク sk7474 2009年2月24日 9:36
    2009年2月14日 3:29
  •  こんにちは。

    SurferOnWww さん、フォローありがとうございます!
    なるほど、確かにそういう話のようですね。

    End、Close、 Flush のどれか、といえば私も Flush が正解だと思います。状況的に End でも Close でもありませんし。

    -------------------------------
    だどさん http://keicode.com/
    • 回答としてマーク sk7474 2009年2月24日 9:38
    2009年2月14日 18:50

すべての返信

  • 自信がないけど1つ思いついたことを。
    その前に、クラス名を書いてほしいです。.NET FrameworkでEnd()メソッドを持つもの+話題から推測してHttpResponseクラスであっていますか?

    HttpResponseクラスのサンプルなどはEnd()もClose()もせず、Flush()だけしています。
    事前にサイズがわかっている場合、Content-Lengthヘッダを指定するとWebサーバ・ブラウザ共に幸せになれます。
    • 回答としてマーク sk7474 2009年2月24日 9:37
    2009年2月13日 10:55
  • こんにちは。

    私が勘違いしているのかもしれませんが、普通、ファイルのダウンロードといったら Content-Disposition を使いますよ。
    それで調べればやり方はすぐにわかると思います。

    ご参考になりましたら幸いです。

    --------------------------------
    だどさん http://keicode.com/
    2009年2月14日 1:53
  •  

    目的は、バッファリングされているすべての出力をクライアントへ送信する
    ことでしょうから、End または Flush が正解だと思います。

    HttpResponse.BufferOutput プロパティはデフォルトで true になっている
    そうですし。

    確かに End の場合、VWD 2008 Express を使い始めたころ、[デバッグ開始]
    で実行すると、ThreadAbortException が throw されるというのは自分も経
    験しました。(VS2008 Pro では同じコードなのに何故だか出ない。理由は調
    べきれてません)。

    そのとき例外が出る条件を調べたところ、Mdsn ライブラリに以下のことが書
    いてありました。

    "スレッドを破棄するために Abort メソッドが呼び出されるときに、共通言
    語ランタイムは ThreadAbortException をスローします。"

    "End メソッド、Redirect メソッドおよび Transfer メソッドの呼び出しで、
    現在の応答が途中で終了すると、ThreadAbortException 例外がスローされま
    す。"

    自分は、気になったので Flush に変えました。

    ただ、End で例外がスローされても、それをハンドルしていなくても何も問
    題は出ないので、実際は気にする必要はないのかもしれません。

    答えになってませんね。(笑)

    • 回答としてマーク sk7474 2009年2月24日 9:36
    2009年2月14日 3:29
  •  こんにちは。

    SurferOnWww さん、フォローありがとうございます!
    なるほど、確かにそういう話のようですね。

    End、Close、 Flush のどれか、といえば私も Flush が正解だと思います。状況的に End でも Close でもありませんし。

    -------------------------------
    だどさん http://keicode.com/
    • 回答としてマーク sk7474 2009年2月24日 9:38
    2009年2月14日 18:50
  • こんにちは。中川俊輔 です。

    皆様、回答ありがとうございます。

    井上さん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?
    勝手ながら、有用な情報と思われる回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年2月24日 9:41