【问题标题】:How to use HttpClient.GetStreamAsync() method?如何使用 HttpClient.GetStreamAsync() 方法?
【发布时间】:2016-12-07 21:49:35
【问题描述】:

我正在尝试使用HttpClient.GetStreamAsync() 方法下载文件。然而这里有一个问题。 GetStreamAsync() 方法返回只读流,所以我不能使用 Length 属性来声明我试图读取字节的字节数组缓冲区。

     using (var file = await _httpClient.GetStreamAsync(url).ConfigureAwait(false))
     {
         // it fails at file.Length below
         byte[] blob = new byte[file.Length];
         await file.ReadAsync(blob, 0, (int)file.Length).ConfigureAwait(false);         
     }

【问题讨论】:

  • i cannot use Length property to declare byte array buffer into which im trying to read bytes。流可以返回字节...你不需要声明一个数组...
  • 顺便说一句:好像你还没试过byte[] blob = await _httpClient.GetByteArrayAsync

标签: c# stream httpclient


【解决方案1】:

您可以将其读入MemoryStream 并从那里获取字节数组:

using (var file = await _httpClient.GetStreamAsync(url).ConfigureAwait(false))
using (var memoryStream = new MemoryStream())
{
  await file.CopyToAsync(memoryStream);
  return memoryStream.ToArray();
}

【讨论】:

  • 你应该在这里等待 file.CopyToAsync
  • 如何通过这种方法使用某种进度报告?
  • @Marcel:我不相信它是 CopyToAsync 内置的;您必须编写自己的复制方法。
【解决方案2】:

我想提出斯蒂芬答案的变体,它可能更简单/更清晰:

using var httpResponse = await _httpClient.GetAsync(url).ConfigureAwait(false);
return await httpResponse.Content.ReadAsByteArrayAsync().ConfigureAwait(false);

这还有一个额外的好处,那就是GetAsync 接受一个取消令牌以用于优雅的取消场景,而GetStreamAsync 不接受,它还允许您根据需要检查请求的状态代码。

【讨论】:

  • 有时您的流太大而无法放入内存,因此最好使用流而不是内存中的整个字节集。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2013-09-19
  • 2012-03-10
  • 2012-08-31
相关资源
最近更新 更多