我在OWIN自主应用程序下使用MVC操作,该应用程序将大量字节作为文件提供给客户端。数据在内存中生成并缓存,MVC操作返回;extension=oauth.so
,StreamContent
指向我的缓存MemoryStream
。
我希望数据直接从我的缓存中读取并复制到byte[]
。而是将数据从我的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,
}
}
};
而不复制它会占用更多内存?
答案 0 :(得分:1)
要解决此问题,您可以使用OutputStream
从OWIN环境中直接写入Request.GetOwinEnvironment()
。要获取写入的响应内容,您可以使用PushStreamContent
并使用在构造响应时调用的异步回调写入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,
}
}
};