C# 如何使OWIN自宿主MVC直接写入输出流
我在OWIN self-host应用程序下使用一个MVC操作,它将大量字节作为文件提供给客户端。数据在内存中生成并缓存,MVC操作返回一个C# 如何使OWIN自宿主MVC直接写入输出流,c#,asp.net,.net,asp.net-web-api,owin,C#,Asp.net,.net,Asp.net Web Api,Owin,我在OWIN self-host应用程序下使用一个MVC操作,它将大量字节作为文件提供给客户端。数据在内存中生成并缓存,MVC操作返回一个StreamContent,其中MemoryStream指向我缓存的字节[] 我希望数据将直接从缓存中读取并复制到OutputStream。而是将数据从myMemoryStream复制到由基础结构创建的另一个。当并行发出大量请求时,我可以看到进程内存增长: return new HttpResponseMessage(HttpStatusCode.OK) {
StreamContent
,其中MemoryStream
指向我缓存的字节[]
我希望数据将直接从缓存中读取并复制到OutputStream
。而是将数据从myMemoryStream
复制到由基础结构创建的另一个。当并行发出大量请求时,我可以看到进程内存增长:
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
,而不复制它,这样会占用更多内存?要克服这一问题,您可以使用请求从OWIN环境获取输出流,直接将其写入输出流。要获得写入的响应内容,可以使用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,
}
}
};