トップ回答者
ファイルダウンロード時のResponse.End() と Response.Close() の使い分けについて

質問
-
ファイルダウンロード処理を作成しています。
この処理を作成する場合、最後にResponse.End() か Response.Close() でダウンロード実行させると思います。
どちらでもダウンロードは可能であることは確認できました。
疑問としてはResponse.End() と Response.Close() のどちらを利用したほうが良いのでしょうか。
私が認識しているデメリットとしては、
・Response.End()
ThreadAbortException 例外が発生する。
・Response.Close()
ソケットが切断されるため、Close後のResponse関連メソッドが利用できない。
です。
私が認識している以外にもメリット、デメリットがありましたら教えて頂けないでしょうか。
以上です。
宜しくお願い致します。
井上 達夫
回答
-
目的は、バッファリングされているすべての出力をクライアントへ送信する
ことでしょうから、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
すべての返信
-
こんにちは。
私が勘違いしているのかもしれませんが、普通、ファイルのダウンロードといったら Content-Disposition を使いますよ。
それで調べればやり方はすぐにわかると思います。
ご参考になりましたら幸いです。
--------------------------------
だどさん http://keicode.com/ -
目的は、バッファリングされているすべての出力をクライアントへ送信する
ことでしょうから、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