我们有一个提供文件的网络服务。最近,我们遇到了一个非常大的文件-超过2 GB-无法复制到缓冲区中。我已经修改了代码以使用HttpCompletionOptions.ResponseHeadersRead
来不使用缓冲区并直接复制到流中。但是,大部分时间我都会得到
System.IO.IOException:'无法从传输连接中读取数据:连接已关闭。'
Curl可以毫无问题地下载它。例外并非每次都会发生,但大多数时候都是这样。我将HttpClient.Timeout
设置为一个小时,所以这不是问题。异常本身非常模棱两可,我找不到任何原因将关闭连接。 Web服务器上的日志也说
信息: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}");
}
}
}
}
更新: 基于注释here,我将复制行更改为同步行,从而解决了该错误。这肯定不是最佳选择,但是我仍在努力弄清楚为什么异步会随机关闭连接。
stream.CopyTo(fileStream.StreamInstance);