c# - 下载超大文件时连接关闭
问题描述
我们有一个提供文件的网络服务。最近,我们遇到了一个非常大的文件 - 超过 2 GB - 无法复制到缓冲区中。我修改了代码以HttpCompletionOptions.ResponseHeadersRead
不使用缓冲区并直接复制到流中。然而,大多数时候我得到
System.IO.IOException:“无法从传输连接读取数据:连接已关闭。”
Curl 可以毫无问题地下载它。异常不会每次都发生,但大多数时候都会发生。我设置HttpClient.Timeout
为一个小时,所以这不是问题。异常本身非常模棱两可,我找不到任何关闭连接的原因。网络服务器上的日志也说
信息:Microsoft.AspNetCore.Server.Kestrel[34] 连接 ID“0HLO4L4D3UAMS”,请求 ID“0HLO4L4D3UAMS:00000001”:应用程序中止了连接。
所以它似乎是客户端的东西。
var requestMessage = GetVeryLargeFile(asset, HttpMethod.Get);
using (var result = await _client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false))
{
result.EnsureSuccessStatusCode();
cancellationToken.ThrowIfCancellationRequested();
using (var stream = await result.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
cancellationToken.ThrowIfCancellationRequested();
using (var fileStream = _fileProvider.Create(filePath))
{
await stream.CopyToAsync(fileStream.StreamInstance).ConfigureAwait(false);
if (fileStream.Length == 0)
{
throw new DataException($"No data retrieved for {asset.Url}");
}
}
}
}
更新:根据此处的评论,我将复制行更改为同步,并修复了错误。这当然不是最佳的,但我仍在努力弄清楚为什么异步会随机关闭连接。
stream.CopyTo(fileStream.StreamInstance);
解决方案
推荐阅读
- python - Python——总是得到“必须是 str 而不是 int”
- java - MongoDB Java 简单示例失败
- javascript - 如何正确转换 fabric.js 中的整个画布/更改织物的原点?
- reactjs - 当调用dismiss事件时.filter,它会抛出错误并且不起作用。它说无法读取未定义的属性“过滤器”
- c# - EFCore SqlClient 错误 LocalDB
- javascript - 使用 for 循环将列表数组插入 html 页表
- r - 从 Excel 导入 R 的日期在以不同方式转换为字符时会产生不同的结果
- azure - 降级 AzureRM PowerShell 模块
- json - 如何使用大 json 测试 REST API
- c++ - 如何修复输出 C++、STL 中文本的位置