2016-07-03 7 views
2

私はOWINセルフホストアプリケーションの下でMVCアクションを使用しています。これはクライアントにファイルの大部分を提供します。データはメモリ内で生成され、キャッシュされ、MVCアクションはを返します。MemoryStreamはキャッシュされたbyte[]を指します。出力ストリームにOWIN自己ホストMVCを直接書き込む方法

データがキャッシュから直接読み取られ、OutputStreamにコピーされると予想しました。代わりに、データは私のMemoryStreamからインフラストラクチャによって作成された別のものにコピーされます。並行してリクエストをたくさん作るとき、私は、プロセスのメモリが成長見ることができます:

return new HttpResponseMessage(HttpStatusCode.OK) 
{ 
    Content = new StreamContent(new MemoryStream(content), content.Length) 
    { 
     Headers = 
     { 
      ContentDisposition = new ContentDispositionHeaderValue("attachment") 
      { 
       FileNameStar = fileName, 
       Size = content.Length, 
      }, 
      ContentType = MediaTypeHeaderValue.Parse(mediaType), 
      ContentLength = content.Length, 
     } 
    } 
}; 

は、どのように私は、私はそれがより多くのメモリを占有しているコピーされることなく、直接私のキャッシュされたMemoryStreamを返すことを確認することができますか?

答えて

1

Request.GetOwinEnvironment()でOWIN環境から入手することで、これを克服するには、OutputStreamに直接書き込むことができます。応答内容を取得するには、PushStreamContentを使用し、応答の構築時に呼び出されるasyncコールバックを使用してOutputStreamに書き込むことができます。

var outputStream = ((HttpListenerContext)Request.GetOwinEnvironment()["System.Net.HttpListenerContext"]).Response.OutputStream; 
    return new HttpResponseMessage(HttpStatusCode.OK) 
    { 
     Content = new PushStreamContent(
      async (stream, httpContent, arg3) => 
      { 
       await outputStream.WriteAsync(content, 0, content.Length); 
       stream.Close(); 
      }) 
     { 
      Headers = 
      { 
       ContentDisposition = new ContentDispositionHeaderValue("attachment") 
       { 
        FileNameStar = fileName, 
        Size = content.Length, 
       }, 
       ContentType = MediaTypeHeaderValue.Parse(mediaType), 
       ContentLength = content.Length, 
      } 
     } 
    }; 
関連する問題