Я немного в растерянности относительно того, как подойти к этому вопросу. Название говорит само за себя. Когда я пытаюсь очистить html с сайта, получаю исключение SocketException. Мне удалось выяснить, что это как-то связано с заголовками, но я понятия не имею, какие заголовки я должен использовать при различных обстоятельствах. У меня есть следующее:
private async void parseHtml(string url)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(url);
var html = await client.GetStringAsync(url); //SocketException here
//Parse html, etc.
}
«SocketException здесь» — что такое полное сообщение об исключении и трассировка стека?
Основные заголовки, которые вам нужны, уже будут добавлены HttpClient. Все остальное сводится к требованиям отдельного сервера. Иногда сервер принимает ограниченный диапазон значений User-Agent, например, предположительно, чтобы затруднить соскребание волос.
Сравните работающее приложение на сервере с вашим приложением, используя сниффер, такой как wireshark или fiddler. Каждый сервер уникален, и без документации по серверу вы можете гадать. HttpClient не очень умен и добавляет к запросу очень мало заголовков. Обычно я пробую IE и смотрю, работает ли он. Затем используйте сниффер, чтобы получить рабочие заголовки.
@canton7 SocketException: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или установленное соединение не удалось, потому что подключенный хост не ответил. В трассировке не было ничего полезного. Я только что заметил, что люди будут устанавливать свои собственные заголовки.
И вы получаете это SocketException по URL-адресу, который вы можете успешно запросить в браузере?
@Джон, я этого не знал. Я предполагал, что он не отправляет никаких заголовков. Я добавил заголовок для аналогичной страницы, которая решила мою проблему, но не повезло для другой страницы. client.DefaultRequestHeaders.Add("Принять", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8");
@кантон это правильно
Вы пытались добавить заголовок User-Agent, как сказал @John?
@jdweng, это очень полезно знать. Похоже, тогда я мог бы просто пойти на wireshark, но тогда все еще остается вопрос, как браузер будет отправлять правильные заголовки.
@Max это меньше «браузер отправляет правильные заголовки» и больше «браузеры отправляют стандартный набор заголовков, и веб-сайты могут ожидать эти заголовки»
Но «Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время» означает, что вам так и не удалось установить соединение. Неважно, какие заголовки вы пытаетесь отправить, потому что вам никогда не удавалось их отправить, как вам никогда не удавалось подключиться.
@canton7 дело в том, что я получал то же сообщение до добавления заголовка для страницы, которую удалось загрузить. Я попытался отправить добавление заголовка пользовательского агента, но это не сработало. Я использовал whatismybrowser.com/detect/…, чтобы получить некоторые заголовки, но попробую добавить остальные и посмотреть, поможет ли это.
Браузер по умолчанию использует больше заголовков, чем Net Library для HttpRequest.
Итак, похоже, что после того, как я добавил следующие 3 заголовка, он заработал: ,изображение/apng,/;q=0,8"); client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br"); client.DefaultRequestHeaders.Add("Accept-Language", "en;q=0.9"); Хотя догадаться и проверить все еще хлопотно





"Мне удалось выяснить, что это как-то связано с заголовками" -- Как? Что вы видели, что вы делали, и как это изменило то, что вы видели?