9

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

如果我将 RangeHeaderValue 设置为 >= 4200,我会得到文件的一部分(尽管response.Content.Headers.ContentLength说大小是 32628 字节,这可能是由于压缩造成的)。Range: bytes=0-4200如果我在Fiddler中看到请求发出,我会看到Miscellaneous. 所以我相当有信心我正确设置了标题。我想不通的是 2 倍,为什么将最大长度设置RangeHeaderValue为小于 ~4200 会导致 aContentLength为 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);

程序输出

4

2 回答 2

3

毫无疑问,服务器声称它遵守范围标准,但似乎忽略了它。使用几个CDN进一步研究,代码可以正常工作。

于 2013-09-17T17:17:22.047 回答
1

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

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

于 2019-08-08T13:34:58.637 回答