我正在使用两个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
将负责清理流?如果需要处理,我如何在传递流响应给调用者的同时完成它的处理?(这可能吗?)
HttpRequestMessage.Dispose
唯一要做的就是处理其Content
流,如果将其传递给Ok
,ASP.Net会为您处理。 - Charlieface