応答ストリームに直接書き込むファイルをダウンロードするために ASP.NET HttpHandler を使用してテストを行っていますが、その方法についてはよくわかりません。これはメソッドの例です。将来、ファイルはデータベースの BLOB に格納される可能性があります。
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
しかし、これが正しいのか、それとももっと良い方法があるのか はわかりません。私の質問は次のとおりです。
- ブラウザでURLを開くと「ファイルの保存」ダイアログが表示されますが、「保存」をクリックする前にサーバーがストリームへのデータのプッシュを開始しているように見えますが、これは正常ですか?
- "response.Flush()" という行を削除すると、ブラウザで URL を開いたときに ... Web サーバーがデータをプッシュしているのがわかりますが、[ファイルの保存] ダイアログが表示されません (または少なくとも合理的な時間の方法ではありません)なぜですか?
- WebRequest オブジェクトで URL を開くと、ストリームを読み取ってファイルを取得できますが、HttpResponse.ContentLength が「-1」であることがわかります。-1 とはどういう意味ですか? HttpResponse.ContentLength が応答の長さを表示するのはいつですか? たとえば、deflate で圧縮された大きな xml をバイナリ ストリームとして取得するメソッドがあるのですが、その場合は... WebRequest でアクセスすると、HttpResponse で ContentLength とストリームの長さが実際にわかります、 どうして?
- Web サーバーで最適なパフォーマンスを得るためにバッファーとして使用する Byte[] 配列の最適な長さはどれくらいですか? 4K から 8K の間であると読みましたが、正しい決定を下すにはどの要素を考慮する必要がありますか。
- この方法は、IIS またはクライアントのメモリ使用量を増大させますか? それとも実際に転移を正しくバッファリングしていますか?
非常に多くの質問をして申し訳ありません。私は Web 開発の新人です :P
乾杯。