Как понять почему зависает скачивание картинки на определённом сайте через httpclient?

Сабж
Есть метод

    public static async Task<string> DownloadFile(string url, string path)
    {
        byte[] data;

        using (var client = new HttpClient())
        using (HttpResponseMessage response = await client.GetAsync(url))
        using (HttpContent content = response.Content)
        {
            data = await content.ReadAsByteArrayAsync();
            using (FileStream file = System.IO.File.Create(path)) 
                file.Write(data, 0, data.Length);
        }
        return "OK";
    }

При попытке скачать изображение с сайта digikey.com метод просто зависает.
Пример ссылки с изображением

https://media.digikey.com/Renders/Analog%20Devices%20Renders/8-SOIC.jpg

Если я загружаю это изображение то все хорошо.

https://i.imgur.com/I5Tl0Q2.jpg

Если я отправляю простой GET запрос через Postman то в ответе получаю картинку.
Понимаю что сайту что то не нравится в запросе, только как понять что?
Как отладить код и скачать картинку?
UDP
Вот такой curl отправляет postman

curl -X GET \
  https://media.digikey.com/Renders/Analog%20Devices%20Renders/8-SOIC.jpg \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/x-www-form-urlencoded' \
  -H 'postman-token: 6580b7fd-5491-20a5-67a0-63119102a341'
Перевожу его в C#

using (var httpClient = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://i.imgur.com/I5Tl0Q2.jpg"))
    {
        request.Headers.TryAddWithoutValidation("cache-control", "no-cache");
        request.Headers.TryAddWithoutValidation("postman-token", "790e386d-6446-c17c-947a-fb0ac2852685");

        var response = await httpClient.SendAsync(request);
    }
}

И получаю точно такую же историю. Скачивание зависает. С имгура грузит нормально.


Ответы (1 шт):

Автор решения: aepot

У меня метод не зависает, сервер ошибку возвращает.

System.Net.Http.HttpRequestException: 'Response status code does not indicate success: 403 (Forbidden).'

Первое: сервер не принимает запросы с российских IP адресов. Через прокси работает, все скачивается. Но у вас может не РФ, поэтому должно и так работать.

Второе: сервер не отправляет ответ вообще (запрос зависает до таймаута), если ему не указать нужные заголовки, а именно Accept и Accept-Encoding.

private static readonly HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All });

public static async Task<string> DownloadFile(string url, string path)
{
    using var src = await client.GetStreamAsync(url);
    using var fs = File.Create(path);
    await src.CopyToAsync(fs);
    return "OK";
}

static async Task Main(string[] args)
{
    client.DefaultRequestHeaders.Accept.ParseAdd("*/*"); // 1 раз надо сделать
    await DownloadFile("https://media.digikey.com/Renders/Analog%20Devices%20Renders/8-SOIC.jpg", "1.jpg");
}

Вот так работает.

В моем случае пришлось через проксю, вот так:

private static readonly HttpClient client = new HttpClient(new HttpClientHandler 
{
    Proxy = new WebProxy("http://<адрес_прокси>:3128") { Credentials = new NetworkCredential("<user>", "<password>") },
    AutomaticDecompression = DecompressionMethods.All
});

То есть все проблемы со скачиванием заключаются здесь только в особенностях работы именно с этим сервером.

→ Ссылка