使用 HTTPCLient 下载文件时减少内存占用

adv*_*api 3 .net c# stream async-await dotnet-httpclient

我想知道是否有一种方法可以避免获取所有缓冲区,然后使用 HttpClient 和 File.WriteAllBytes 将它们写入文件。

这是我使用的代码片段

public async Task<byte[]> DownloadAsByteArray(string filename)
{
    _logger.LogDebug($"Start downloading {filename} file at {DateTime.Now}");
    
    var result = await _httpClient.GetByteArrayAsync(filename);
    
    return result;
}
Run Code Online (Sandbox Code Playgroud)
var bytes = await _downloadFileService.DownloadAsByteArray(fileDownload);

await File.WriteAllBytesAsync(fullFlePathName, bytes);
Run Code Online (Sandbox Code Playgroud)

对于相当大的文件,应用程序内存增长得非常快。

Pet*_*ala 6

GetAsync使用代替GetByteArrayAsync和 使用Content's怎么样CopyTo

var response = await _httpClient.GetAsync(uri);
using var fs = new FileStream(...);
await response.Content.CopyToAsync(fs);
Run Code Online (Sandbox Code Playgroud)

或者使用GetStreamAsync

using var responseStream = await _httpClient.GetStreamAsync(uri);
using var fs = new FileStream(...);
await responseStream.CopyToAsync(fs);
Run Code Online (Sandbox Code Playgroud)