Я разрабатываю приложение, которое определяет информацию о веб-страницах. Один из компонентов этого заключается в отправке HTTP-запроса GET на URL-адрес, захвате HTML и его анализе. Это отлично работало со всеми URL-адресами, которые я ему указывал, кроме одного ...
Виновником является .NET HttpClient
, который всегда, кажется, теряет время ожидания при запросе любого URL-адреса в проблемной области. Однако тот же URL-адрес, запрошенный браузером, возвращает контент в течение миллисекунд. В заголовках нет ничего необычного.
Увеличение тайм-аута просто приводит к тому, что бомбометание занимает больше времени. Я пробовал минуты с тем же результатом. Я пробовал разные вещи, например, настраивал строку User Agent на строку Chrome, но безрезультатно.
Рассматриваемый домен: http://careers.adidas-group.com Обратите внимание на этот же сайт работает по HTTPS по адресу https://careers.adidas-group.com (имеет действующий сертификат) . Использование любого протокола приводит к одной и той же ошибке.
Я могу показать проблему с помощью простого консольного приложения C #, показанного ниже:
static void Main(string[] args)
{
string url = "http://careers.adidas-group.com";
var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(10)
};
using (var message = new HttpRequestMessage(HttpMethod.Get, url))
{
using (var httpResponse = Task.Run(() => client.SendAsync(message)).Result)
{
Console.WriteLine("{0}: {1}", httpResponse.StatusCode, httpResponse.ReasonPhrase);
}
}
Console.ReadLine();
}
Обратите внимание, что в приведенном выше примере я установил тайм-аут на 10 секунд, просто чтобы ускорить решение проблемы, однако увеличение тайм-аута не имеет значения.
Тот же код с другим URL-адресом (например, https://stackoverflow.com/) работает нормально.
Также обратите внимание, что приведенный выше код упрощен для запуска в качестве консольного приложения. Мой фактический код выполняется правильно асинхронно (с использованием await) в методе async MVC-контроллера - я просто использую Task.Run(() => )
, чтобы заставить его работать с контекстом синхронного метода Main в примере. Но для результата это не имеет значения. (Фактическое исключение - «Задача была отменена», но это скорее симптом тайм-аута, а не реальная проблема).
Может ли кто-нибудь объяснить мне, почему это происходит (это связано с конфигурацией сервера?) И что, если что-то еще, я могу сделать, чтобы HttpClient выполнил запрос? Спасибо.
user-agent
в запросе к некоторым популярным агентам браузера, но это не имело никакого значения. - person Dan Diplo   schedule 14.02.2018