WebRequest.AddRange не возвращает правильную длину содержимого - PullRequest
1 голос
/ 13 июля 2020

Я хочу частично загрузить файл по URL-адресу. Но он возвращает неправильный размер контента, и я не мог понять, почему. Удаленный файл имеет Accept-Ranges=bytes Как это можно решить?

long start = 536871935, end = 805306878;
string url = "http://ipv4.download.thinkbroadband.com/1GB.zip";

var request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362";
request.AllowAutoRedirect = true;
request.Method = "GET";
request.Timeout = 5000;
request.ReadWriteTimeout = 3000;
request.AddRange(start, end);

var response = (HttpWebResponse)request.GetResponse();
if (response.ContentLength != end - start + 1)
    throw new Exception(string.Format("Returned content size is wrong; start={0}, end={1}, returned = {2}, shouldbe = {3}",
            start, end, response.ContentLength, end - start + 1));
        

Исключение типа 'System.Exception' произошло в Downloadmanager.exe, но не было обработано в пользовательском коде

Дополнительная информация: неверный размер возвращаемого содержимого: начало = 536871935, конец = 805306878, возвращено = 536869889, должно быть = 268434944

1 Ответ

1 голос
/ 13 июля 2020

Я использую HttpClient вместо HttpWebRequest (как рекомендовано Microsoft), и у меня нет такой проблемы.

public class Program
{
    private static readonly HttpClient client = new HttpClient();

    static async Task Main(string[] args)
    {
        long start = 536871935, end = 805306878;
        try
        {
            using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://ipv4.download.thinkbroadband.com/1GB.zip"))
            {
                request.Headers.Range = new RangeHeaderValue(start, end);
                using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
                {
                    response.EnsureSuccessStatusCode();
                    Console.WriteLine(response.Content.Headers.ContentLength);
                    Console.WriteLine(end - start + 1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }
}

Вывод в консоль

268434944
268434944
...