私たちの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;
}
多くのおかげでMatias、Response.OutputStreamへのコピーはトリックを行います。 System.Web.Mvc.Controller.File()がすべてをメモリにロードしようとしているようです – user5133888