1

ユーザーに大きなファイルのダウンロードを提供するためのasp.net Webページがあります。このページは、IIS7、Windows Server 2008 でホストされています。

奇妙なことに、コンテンツ長の応答ヘッダーを追加しない場合、ユーザーは適切な速度 (2MB/秒) でダウンロードできますが、このヘッダーを追加するとすぐに、ダウンロード速度が約 35kbps/秒に低下します。

これはコードです:

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/octet-stream";
//speed drops when I add this line:
//Response.AddHeader("Content-Length", new FileInfo(filepath).ToString());

Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.TransmitFile(filepath);

Response.Flush();

もちろん、コンテンツの長さを省略することもできますが、ユーザーはファイルの大きさやダウンロードにかかる時間を知ることができません...これは面倒です。

このダウンロード速度の大きな変化の原因は何ですか?

洞察を事前にありがとう!

4

2 に答える 2

1

最近、次のコードを使用しました...

Response.AddHeader("Content-disposition", "attachment; filename=" + attachment.Filename);
Response.AddHeader("Content-length", attachment.Filedata.Length.ToString());
Response.ContentType = attachment.ContentType;
Response.OutputStream.Write(attachment.Filedata.ToArray(), 0, attachment.Filedata.Length);
Response.End();

(この場合、添付ファイルは実際にはデータベース テーブルに格納されますが、出力ストリームにバイト配列を書き込むだけです)

あなたのアプローチではなく...

Response.TransmitFile(filepath);

転送速度はかなり良いようです。ライブ Web サイトからほんの数秒で 3.5 MB をダウンロードしました。(地元だけじゃない!)

Response をハイジャックするのではなく HttpHandler を使用する必要があることはわかっていますが、これは今のところ機能します。また、大量のメモリを消費しないように、おそらくバイト配列をチャンクで読み取る必要があります。ある時点で戻って、少し手直しします。

Response.OutputStream.Writeそのため、代わりに HttpHandlerを使用または作成してみることができます。

とにかく、それがお役に立てば幸いです。

于 2010-02-18T22:16:44.977 に答える
0

Response.AddHeader("Content-Length", ...) は大惨事です!

私たちは .NET 4.0 を使用し、奇妙でランダムなダウンロードの破損をたくさん経験しました。クライアントに送信された応答ヘッダーのコンテンツの長さの不一致に絞り込みました。理由はわかりませんが、.NET 4.0 のバグでしょうか? しかし、Response.AddHeader("Content-Length", ...) というコード行をコメントアウトすると、すべての問題が解消されました。

編集: IIS7 動的圧縮が有効になっている場合、コンテンツの長さの不一致は避けられない可能性があります。

于 2011-05-13T14:56:31.767 に答える