1

如何使用 C# HttpClient 下载大文件的一部分,例如 HttpWebRequest.AddRange(123)?

public async void StartDownload(CancellationToken cancellationToken)
{
    try
    {
        if (_isWork)
            return;

        _isWork = true;
        using (var response = await GetAsync(_doenloadUrl, HttpCompletionOption.ResponseHeadersRead, cancellationToken))
            await DownloadFileFromHttpResponseMessage(response);
    }
    catch (Exception e)
    {
        downloadExceptiondHandler?.Invoke(_doenloadUrl, e);
    }
}
4

1 回答 1

1

RangeHTTP 协议中为此目的指定了一个标头:

Range HTTP 请求标头指示服务器应返回的文档部分。[...]服务器还可以忽略 Range 标头并返回带有 200 状态代码的整个文档。来源,强调我的)

因此,您不能依赖服务器仅返回该文件范围。

但是,在HttpRequest有一个属性RangeHttpRequestHeaders设置Range请求的

private async Task<HttpResponseMessage> GetAsync(string downloadUrl, 
                                                 int rangeStart, 
                                                 int rangeEnd)
{
    // Beware: C# 8, use a using block with older language specifications
    using var request = new HttpRequestMessage 
                            { 
                                RequestUri = new Uri(donloadUrl), 
                                Method = HttpMethod.Get 
                            };

    request.Headers.Range = new RangeHeaderValue(rangeStart, rangeEnd);
    return await _httpClient.SendRequestAsync(request);
}
于 2020-05-11T08:30:27.290 回答