C# 如何使OWIN自宿主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) {

我在OWIN self-host应用程序下使用一个MVC操作,它将大量字节作为文件提供给客户端。数据在内存中生成并缓存,MVC操作返回一个
StreamContent
,其中
MemoryStream
指向我缓存的
字节[]

我希望数据将直接从缓存中读取并复制到
OutputStream
。而是将数据从my
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
,而不复制它,这样会占用更多内存?

要克服这一问题,您可以使用
请求从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,
            }
        }
    };