由于调用HttpClient.SendAsync()
,我有一个HttpResponse
对象。响应有一个chunked
transfer encoding,并导致1.5 GB的数据。通过Owin流式传输HttpResponse
我想通过OWIN管道传递这些数据。为此,我需要将其转换为流。简化代码这样做是:
public async Task Invoke(IDictionary<string, object> environment)
{
var httpContent = GetHttpContent();
var responseStream = (Stream)environment["owin.ResponseBody"];
await httpContent.CopyToAsync(responseStream);
}
但是,最后一行导致将整个流复制到内存。当我使用wget
直接从后端服务器下载数据时,它成功下载并显示一个进度条(尽管它不知道整体大小,因为它已被分块)。但是,当我使用wget
从OWIN托管的应用程序下载数据时,它坚持发送请求。
我应该如何通过OWIN管道传输这些数据以防止将其复制到内存中?
编辑
这是我如何得到HttpResponse
:
var client = new HttpClient(new HttpClientHandler());
// …and then:
using (var request = new HttpRequestMessage { RequestUri = uri, Method = HttpMethod.Get })
{
return client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
}
server.DisableResponseBuffering
你能告诉你的HttpClient打电话?大多数HttpClient方法默认缓冲响应。你需要一个不像GetStreamAsync或带有HttpCompletionOption.ResponseHeadersRead的SendAsync。 – Tratcher我更新了问题。谢谢。 – bpiec
看起来不错,(除了使用等待结果)。 – Tratcher