如何使OWIN自主MVC直接写入输出流

时间:2016-07-03 16:07:09

标签: c# asp.net .net asp.net-web-api owin

我在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, } } }; 而不复制它会占用更多内存?

1 个答案:

答案 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,
            }
        }
    };