从 HttpClient.GetStreamAsync 获取文件大小

问题描述 投票:0回答:1

如何在返回

HttpClient
 之前检索我使用 
fileStreamResult

获取的文件的大小
    public async Task<FileStreamResult> Index(string id)
    {
        var urlToDownloadFromService= _upDownService.Downloadables.Find(d => d.Name == id);

        HttpClient client = new HttpClient();
        Stream stream = await client.GetStreamAsync(new Uri(urlToDownloadFromService.UrlSource));
        var fileStreamResult =  new FileStreamResult(stream, "application/octet-stream");
        return fileStreamResult;
    }

stream.Length
不起作用,因为
ContentLengthReadStream
没有实现该方法

更新

在 dotnetcore 框架中,

HttpConnection
的实现从
response
对象中获取长度信息,如下所示

else if (response.Content.Headers.ContentLength != null)
{
     long contentLength = Response.Content.Headers.ContentLength.GetValueOrDefault();
.
.
.
.

     responseStream = new ContentLengthReadStream(this, (ulong)contentLength);

Github来源httpConnection

c# .net-core asp.net-core-mvc
1个回答
0
投票

HttpClient.GetStreamAsync()
方法不支持HTTP
Content-Length
,由HTTP服务器报告为HTTP协议的标头。

所以,你无法通过

HttpClient.GetStreamAsync()
获取文件大小。

我建议使用

HttpClient.GetAsync()
方法。结果是
HttpResponseMessage

在获取流之前,您可以使用

HttpResponseMessage.Content.Headers.ContentLength
获取文件大小。

但并非每个 HTTP 服务器都会报告 HTTP

Content-Length
。所以也许,这个值是
0
而不是文件大小;

直播,你可以通过

HttpResponseMessage.Content.ReadAsStream()
获得。

© www.soinside.com 2019 - 2024. All rights reserved.