我们有一个提供文件的网络服务。最近,我们遇到一个非常大的文件 - 超过 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}");
}
}
}
}
更新:
根据评论here https://stackoverflow.com/questions/42516827/system-net-webexception-unable-to-read-data-from-the-transport-connection-the,我将复制行更改为同步,这修复了错误。这当然不是最佳的,但我仍然在努力弄清楚为什么异步会随机关闭连接。
stream.CopyTo(fileStream.StreamInstance);
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)