如何使用HttpClient.GetStreamAsync()方法?

时间:2016-12-07 21:49:35

标签: c# stream httpclient

我正在尝试使用HttpClient.GetStreamAsync()方法下载文件。但是这里有一个问题。 GetStreamAsync()方法返回readonly流,因此我不能使用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);         
     }

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:-1)

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

>>> num = list(range(10000))
>>> target = num[-1] + num[-2]

>>> %timeit twosum(num, target)
12.3 s ± 276 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

>>> %timeit twosum_O_n(num, target)
1.44 ms ± 21.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

这还有一个额外的好处,即 using var httpResponse = await _httpClient.GetAsync(url).ConfigureAwait(false); return await httpResponse.Content.ReadAsByteArrayAsync().ConfigureAwait(false); 接受用于正常取消场景的取消令牌,而 GetAsync 不接受,并且它还允许您根据需要检查请求的状态代码。