我想知道是否有一种方法可以避免获取所有缓冲区,然后使用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;
}
var bytes = await _downloadFileService.DownloadAsByteArray(fileDownload);

await File.WriteAllBytesAsync(fullFlePathName, bytes);

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

推荐答案

GetAsync代替GetByteArrayAsync,用ContentCopyTo怎么样?

var response = await _httpClient.GetAsync(uri);
using var fs = new FileStream(...);
await response.Content.CopyToAsync(fs);

或使用GetStreamAsync

using var responseStream = await _httpClient.GetStreamAsync(uri);
using var fs = new FileStream(...);
await responseStream.CopyToAsync(fs);

Csharp相关问答推荐

.NET最小API映射将T参数列表为[FromQuery]

ListaryImportProperty的默认DllImportSearchPathsProperty行为

使用客户端密钥为Fabric Rest API生成令牌

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

C#DateTime.ToString在ubuntu和centos中返回不同的结果

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

使用带有WithAppOnly()请求选项的pageIterator

TCPClient阅读流

Blazor Web App WASM的两个独立项目令人困惑

在ASP.NET Core 8 MVC中本地化共享视图

为什么我的伺服电机不动,下面的代码?

从Base64转换为不同的字符串返回相同的结果

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

Visual Studio如何使用当前的框架?

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

并发表更新.EF核心交易

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

.NET6最小API:操作.MapGet之后的响应

组件';EditForm';使用与包含子内容元素';授权';相同的参数名称(';上下文';)