【问题标题】:How to correctly configure HttpClient's streaming for large files?如何为大文件正确配置 HttpClient 的流式传输?
【发布时间】:2019-10-10 15:33:25
【问题描述】:

微软HttpClient的官方文档指出,如果我们想使用HttpClient下载大文件,我们应该

流式传输这些下载,而不使用默认缓冲。如果使用默认缓冲,客户端内存使用量将变得非常大,可能会导致性能大幅下降。

什么是默认缓冲,我们如何更改它,这样无论我们最终下载的文件大小如何,我们都不会遇到上述问题?

一个虚拟代码 sn-p 将不胜感激!

【问题讨论】:

  • @RyanWilson 基本上允许我们更改最大下载大小,对吗?我不确定仅将其更改为高值是否可以解决问题。据我了解,默认缓冲在某种程度上会严重影响性能。这是否意味着内容存储在内存中?如果是这样,并发下载请求确实会大大降低我们的机器速度。

标签: c# dotnet-httpclient


【解决方案1】:

您必须使用GetStreamAsync 方法。如documentation中所述:

此操作不会阻塞。返回的 Task 对象将在读取响应标头后完成。 此方法不读取也不缓冲响应正文

示例:

HttpClient httpClient = new HttpClient();

var requestUri = "http://url-to-resource.com";
var stream = await httpClient.GetStreamAsync(requestUri);

using (var fileStream = File.Create("outputFile.ext"))
{
    await stream.CopyToAsync(fileStream);
}

GetByteArrayAsyncGetStringAsync 等所有其他方法都会缓冲响应,并在读取整个响应正文后完成。

CopyToAsync 使用的默认缓冲区大小是 _DefaultCopyBufferSize 声明的 81920 字节。您可以使用重载CopyToAsync(Stream, Int32) 来更改它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2019-11-04
    • 2017-11-21
    相关资源
    最近更新 更多