繁体   English   中英

从 ReadAsStreamAsync 传递 Stream 作为 API 响应并避免 memory 对象中的大对象

[英]Passing Stream from ReadAsStreamAsync as API response and avoiding large in memory objects

我正在使用两个用于从外部系统下载大型文档的 API。

我调用 API 1 并提供有关要检索的文档的一些信息,API 1 然后调用 API 2 并提供相同的信息作为“中间人”。 API 1 获取文档二进制文件,然后将其传递给原始调用者。

我想避免的是在 memory 对象中创建代表这些文档的大型对象,并一直传递 stream 作为响应,这是否可以通过描述的设置(“中间人”API)实现?

我所拥有的基本示例(在 API 1 中):

var request = new HttpRequestMessage(HttpMethod.Post, "https://example.com/api/getdocs");
request.Content = parameters;

// 'ResponseHeadersRead' - indicate completion on reading of headers and not entire response...
var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

if (response.StatusCode == HttpStatusCode.OK)
{
     var stream = await response.Content.ReadAsStreamAsync();

     return this.Ok(stream);
}
else
{
    // Logging/error handling...
}

来自此的响应被原始调用者读取为 stream,然后传递给FileStreamResult ,后者将文档下载到客户端计算机上。

我的问题:

  • var stream = await response.Content.ReadAsStreamAsync()行是否仍在 memory object 中创建代表文档的大文件?
  • 上面的 stream 是否需要处理,或者底层的HttpContent会负责清理 stream 吗? 如果确实需要处理它,我如何在仍然向调用者传递 stream 响应的同时执行此操作? (这甚至可能吗?)

您传递给Okstream不应被处置。 Ok将包装 stream 并将其作为响应反馈给客户端,因此如果您处置它,则响应将失败。

从技术上讲,至少根据IDisposable的口头禅,你应该处置response 但是,这样做会导致它也处理 stream,因此您也不应该处理response

不要担心它会导致任何泄漏: HttpResponseMessage不会处理除内容 stream 以外的任何内容。请参阅以下源代码

     protected virtual void Dispose(bool disposing)
     {
         // The reason for this type to implement IDisposable is that it contains instances of types that implement
         // IDisposable (content). 
         if (disposing && !disposed)
         {
             disposed = true;
             if (content != null)
             {
                 content.Dispose();
             }
         }
     }

但是,您应该using块处理request ,尽管在您的情况下,这也只是处理内容parameters

  1. FileStreamResult从输入 stream 读取字节到缓冲区(默认情况下为 4kb)并将它们写入 output stream。因此不应创建大的 memory object。
  2. FileStreamResult中输入 stream 读取过程被using语句包裹。 它将被正确处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM