【问题标题】:HttpClient and HttpRequestHeaders.RangeHttpClient 和 HttpRequestHeaders.Range
【发布时间】:2013-09-10 21:49:33
【问题描述】:

我正在尝试使用 HttpClient 仅下载文件的一部分(在本示例中,来自 SEC 网站)。

如果我将 RangeHeaderValue 设置为 >= 4200,我会得到文件的一部分(尽管 response.Content.Headers.ContentLength 表示大小为 32628 字节,这可能是由于压缩造成的)。如果我在 Fiddler 中看到请求发出,我会看到 Range: bytes=0-4200 作为 Miscellaneous 下的标头。所以我相当有信心我正确设置了标题。我无法弄清楚的是 2 倍,为什么将 RangeHeaderValue 上的最大长度设置为小于 ~4200 会导致 ContentLength 为 0(在 Fiddler 中确认)以及为什么 ContentLength 与请求不匹配范围?

我已经确认(通过查看标头)SEC 服务器支持范围 (Accept-Ranges: bytes)。示例代码如下。

var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip });
var request = new HttpRequestMessage { RequestUri = new Uri("http://www.sec.gov/Archives/edgar/full-index/2013/QTR1/company.idx") };
request.Headers.Range = new RangeHeaderValue(0, 1000);

Console.WriteLine(request.Headers.Range.Ranges);
var response = await client.SendAsync(request);
Console.WriteLine(response.Headers);
Console.WriteLine(response.Content.Headers.ContentLength);
Console.WriteLine(response.RequestMessage);

【问题讨论】:

    标签: c# http-headers httpclient


    【解决方案1】:

    这里没有问题,服务器声称它遵守范围标准但似乎忽略了它。使用几个CDN进一步研究,代码运行正常。

    【讨论】:

      【解决方案2】:

      确认服务器仍未实现部分下载(字节范围)。 我设置了 Range: bytes=0-4201Range: bytes=0-1000 并且一直得到完整的文件:45,846,783 字节。

      获取部分文件的一种方法是在有足够字节时暂停/停止下载。但是,这适用于从零开始的字节范围(文件的前几个字节),而不适用于文件的中间部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 2017-05-30
        相关资源
        最近更新 更多