我在 OWIN 自托管应用程序下使用 MVC 操作,该操作将大量字节作为文件提供给客户端。数据在内存中生成并缓存,MVC 操作返回一个 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,
}
}
};
如何确保直接返回缓存的 MemoryStream
而不会被复制占用更多内存?
最佳答案
为了克服这个问题,您可以通过使用 Request.GetOwinEnvironment()
从 OWIN 环境中获取它来直接写入 OutputStream
。要获取写入的响应内容,您可以使用 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,
}
}
};
关于c# - 如何让 OWIN 自托管 MVC 直接写入输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38171782/