Как правильно настроить потоковую передачу HttpClient для больших файлов? - PullRequest
2 голосов
/ 10 октября 2019

Официальная документация Microsoft для HttpClient гласит, что если мы хотим использовать HttpClient для загрузки больших файлов, мы должны

передавать эти загрузки и не использовать буферизацию по умолчанию. Если используется буферизация по умолчанию, использование памяти клиентом будет очень большим, что может привести к значительному снижению производительности.

Что такое буферизация по умолчанию и как мы ее изменим, чтобы у нас не былопроблемы, описанные выше, независимо от размера файла, который мы загружаем?

Фрагмент фиктивного кода будет высоко оценен!

1 Ответ

2 голосов
/ 10 октября 2019

Вы должны использовать метод GetStreamAsync. Как указано в документации :

Эта операция не блокируется. Возвращенный объект 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);
}

Все остальные методы, такие как GetByteArrayAsync или GetStringAsync, будутбуферизуйте ответ и завершится после прочтения всего тела ответа.

Размер буфера по умолчанию, используемый CopyToAsync, составляет 81920 байт, как объявлено _DefaultCopyBufferSize . Вы можете изменить его, используя перегрузку CopyToAsync(Stream, Int32).

...