下载超大文件时连接关闭

时间:2019-07-12 14:08:04

标签: c# webclient

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

0 个答案:

没有答案