2016-05-31 13 views
1

私たちのASP.NET MVCエンドポイントは、動的に生成された約400MBのXMLドキュメントを返す他のサードパーティのHTTPエンドポイントへのプロキシとして動作します。C#ストリーム第三者からの応答、最小バッファリング

"最小限の"バッファリングを使用してエンドポイントのユーザーに直接サードパーティの応答を「ストリーミング」する方法はありますか?

現時点では、ASP.NET System.Web.Mvc.Controller.File()はファイル全体を応答としてメモリに読み込みます。 メモリ使用量の急増以外、これをどのように確認できるのかよく分かりませんか?

System.Web.Mvc.Controller.File(

その後ガベージコレクションによって再主張されている400メガバイト、によってIISアプリケーションプールのメモリ使用量が増加します。

我々は避けることができれば、それはいいだろうSystem.Web.Mvc.Controller.File() は、それが可能であり、「ほとんど直接」受信応答からそれをストリーミングすることによって、メモリに全400メガバイトのストリングをロード?

モックC#のlinqpadコードはおおよそこの

ようなものです
public class MyResponseItem { 
    public Stream myStream; 
    public string metadata; 
} 

void Main() 
{ 
    Stream stream = MyEndPoint(); 

    //now let user download this XML as System.Web.Mvc.FileResult 
    System.Web.Mvc.ActionResult fileResult = System.Web.Mvc.Controller.File(stream, "text/xml"); 
    fileResult.Dump(); 
} 

Stream MyEndPoint() { 
    MyResponseItem myResponse = GetStreamFromThirdParty("https://www.google.com"); 
    return myResponse.myStream; 
} 

MyResponseItem GetStreamFromThirdParty(string fullUrl) 
{ 
    MyResponseItem myResponse = new MyResponseItem(); 
    System.Net.WebResponse webResponse = System.Net.WebRequest.Create(fullUrl).GetResponse(); 
    myResponse.myStream = webResponse.GetResponseStream(); 
    return myResponse; 
} 

答えて

3

あなたはバッファリングだけ出力ストリーム、迅速なn」は、ここで本の汚い例に直接ストリームをコピーしないことにより、メモリフットプリントを減らすことができます。

public async Task<ActionResult> Download() 
    { 
     using (var httpClient = new System.Net.Http.HttpClient()) 
     { 
      using (
       var stream = await httpClient.GetStreamAsync(
        "https://ckannet-storage.commondatastorage.googleapis.com/2012-10-22T184507/aft4.tsv.gz" 
        )) 
      { 
       Response.ContentType = "application/octet-stream"; 
       Response.Buffer = false; 
       Response.BufferOutput = false; 
       await stream.CopyToAsync(Response.OutputStream); 
      } 
      return new HttpStatusCodeResult(200); 
     } 
    } 

あなたも、より多くのあなたのフットプリントを削減したい場合CopyToAsync(Stream, Int32)過負荷でより低いバッファサイズを設定できます。デフォルトは81920バイトです。

+1

多くのおかげでMatias、Response.OutputStreamへのコピーはトリックを行います。 System.Web.Mvc.Controller.File()がすべてをメモリにロードしようとしているようです – user5133888

関連する問題