Как понять почему зависает скачивание картинки на определённом сайте через 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'
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 шт):
У меня метод не зависает, сервер ошибку возвращает.
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
});
То есть все проблемы со скачиванием заключаются здесь только в особенностях работы именно с этим сервером.