2009-04-10 6 views
5

最初は、Response.CloseとResponse.Endの違いが何であるかを把握しようとしていましたが、より多くのグーグルと研究を行った後、共通点Byte []はクライアントに送り返されます。下のコードサンプルを残しておきますが、これを行うための業界標準が何であるか知りたいと思います。ASP.NETユーザーにストリームファイルする方法

Byte[] myBytes = GetReportBytes(); 
HttpContext.Current.Response.ClearContent(); 
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString()); 
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension()); 
HttpContext.Current.Response.ContentType = GetApplicationContentType(); 
HttpContext.Current.Response.BinaryWrite(myBytes); 
HttpContext.Current.Response.Flush(); 
HttpContext.Current.Response.Close(); 
//CERT FIX 
//HttpContext.Current.Response.End(); 

答えて

15

私はResponse.Close()またはResponse.End()と呼ぶことはありません。

Response.End()は、その時点でページの実行/レンダリングを停止します。 Response.End()のコードは実行されません。その時点でレスポンスは終了し、それ以上の出力はストリームに追加されません。

Response.Close()Response.End()と似ていますが、呼び出し後にコードを実行することができます(ただし、ページ応答では出力できません)。

Response.Flush()は、残りの応答項目をページに送信します。 IIS core team memberから

: - あなたが であれば、例えば

Response.Closeは クライアントにリセットパケットを送信し、あらゆる種類の問題に をリードするエラー条件以外 でそれを使用して十分な数の 待ち時間を持つクライアントと話す場合、リセットパケットは、 のいずれかの他の応答データを サーバ、クライアントまたはどこかの間でバッファされるようにすることがあります。間には、 が削除されます。この特定のケースで

、圧縮 は共通のパターンの応答内 を探し含み、 応答のいくらかの量は パターンを繰り返す長い見つける 機会を増加させるために 圧縮コードによってバッファリングされなければならない - すなわち、この部分あなたが Response.Close()を実行すると、クライアントに を送信することはできません。

要するに、Response.Close()を使用しないでください。

+0

ありがとうございました... – RSolberg

+0

@Mitch - 一般的なストリーミング方法の詳細については、少し質問を変更しています。私は本当にこれのための標準を見ていないとそこから始めたいと思います。 – RSolberg

+3

ファイルをストリーミングするときにResponse.Close()またはResponse.End()を呼び出さないでください。 Response.Flush()を呼び出して、バッファからファイルを送信し、メソッドを終了しますか? – StuperUser

関連する問題