首页 > 解决方案 > 下载超大文件时连接关闭

问题描述

我们有一个提供文件的网络服务。最近,我们遇到了一个非常大的文件 - 超过 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);

标签: c#webclient

解决方案


推荐阅读