2011-08-05 13 views
2

ダウンロードするデータ量がかなり大きくなりました。しかし、それがファイルを待って、サーバ上のメモリの大規模な量を使用しているASP.NET C#で即座にダウンロードを実行するには?

 
     HttpContext.Current.Response.AppendHeader("content-disposition", String.Format("attachment; filename={0}", filename)); 
      HttpContext.Current.Response.BinaryWrite(ms.ToArray()); 

      HttpContext.Current.Response.End(); 

現在、当社のシステムは、ちょうど(私たちがファイルを使用しないでください)

コードストリームを出力しますダウンロードしてください。待っているよりすぐにダウンロードを開始するようにしたいのですが...どうすればいいですか?

+0

これは多かれ少なかれこの質問に含まれています:http://stackoverflow.com/questions/6781732/unbuffered-output-from-ihttphandler –

答えて

2

はこれを設定してみてください:

HttpContext.Current.Response.BufferOutput = false; 
+1

バッファリングがオフになっている理由。バッファリングをオフに切り替えると、最後まで待つのではなく、出力バッファに書き込むときにクライアントにデータが送信されます。 –

4

問題は、Webサーバーのメモリに全体の内容を置くMemoryStream.ToArray方法です。

メモリストリームを別の方法でBinaryWriteに渡すと、あまりメモリを必要とせずにバッファリングしてクライアントにデータをストリーミングすることができます。

4

ダウンロード全体を配列に変換するのではなく、データをソースストリームから直接デスティネーションストリームにコピーする必要があります。

ストリーム間をコピーするには、Best way to copy between two Stream instances - C#を参照してください。推測msから

は、メモリストリームであり、従って以下は、トリックを行う必要があります。

CopyStream(ms, HttpContext.Current.Response.OutputStream); 

いっそしかし、どのように、出力ストリームにではなく、中間ストリームに直接書き込むことであろうこれは、msに含まれるデータの入手方法によって異なります。

関連する問題