gpt4 book ai didi

c# - 从 ReadAsStreamAsync 传递 Stream 作为 API 响应并避免大内存对象

转载 作者:行者123 更新时间:2023-12-05 05:45:03 25 4
gpt4 key购买 nike

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

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

我想避免的是创建表示这些文档的大量内存对象,并一直传递一个流作为响应,这是否可以通过描述的设置(“中间人”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...
}

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

我的问题:

  • var stream = await response.Content.ReadAsStreamAsync() 行是否仍在创建表示文档的大型内存对象?
  • 是否需要处理上面的流,或者底层 HttpContent 是否会负责清理流?如果确实需要处理它,我如何在仍然将流响应传递给调用者的同时执行此操作? (这可能吗?)

最佳答案

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

从技术上讲,至少根据 IDisposable 咒语,您应该处置 response。但是,这样做会导致它也处理流,因此您也应该处理response

不要担心它会导致任何内容泄漏:HttpResponseMessage 除了内容流之外不会处理任何内容。参见 the below source code :

     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 block 处理request,尽管这也只是处理内容,在您的情况下是parameters.

关于c# - 从 ReadAsStreamAsync 传递 Stream 作为 API 响应并避免大内存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71471102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com