#c# #.net #.net-core #httpwebrequest
Вопрос:
Я хотел бы создать инструмент для проверки допустимости URL-адреса (допустимо: он возвращает 200). У меня есть два примера страниц регистрации авиакомпаний, и оба они корректно работают в браузере. Однако британские авиакомпании всегда делают исключение из-за ответа 500. Что не так с моим кодом?
static void Main(string[] args)
{
var testUrl1 = new Program().UrlIsValid("https://www.klm.com/ams/checkin/web/kl/nl/nl");
var testUrl2 = new Program().UrlIsValid("https://www.britishairways.com/travel/olcilandingpageauthreq/public/en_gb");
Console.WriteLine(testUrl1 "t - https://www.klm.com/ams/checkin/web/kl/nl/nl");
Console.WriteLine(testUrl2 "t - https://www.britishairways.com/travel/olcilandingpageauthreq/public/en_gb");
}
public bool UrlIsValid(string onlineCheckInUrl)
{
try
{
var request = (HttpWebRequest)WebRequest.Create(onlineCheckInUrl);
request.Method = "GET";
var response = (HttpWebResponse)request.GetResponse();
return (response.StatusCode == HttpStatusCode.OK);
}
catch (Exception e)
{
return false;
}
}
Комментарии:
1. 500-это код ответа на стороне сервера. Проверьте, указана ли в ответе дополнительная информация.
2. Используйте ПАРАМЕТРЫ и просмотрите доступные API, а затем вы можете использовать HEAD или ТРАССИРОВКУ в зависимости от необходимости.
3. Как часто вы хотите отправлять эти запросы? Я спрашиваю об этом, потому что некоторые сайты используют некоторую логику ограничения скорости, чтобы избежать DOS-атак. Так что, если частота слишком высока, вас можно задушить.
4. В качестве примечания: действительность Url-адреса не имеет ничего общего с доступностью. Пожалуйста, попробуйте использовать лучшее название, потому что текущее вводит в заблуждение. (
Uri.TryCreate
иUri,IsWellFormedUriString
являются встроенными функциями для определения достоверности)5. @PeterCsala Я хотел бы отправлять этот запрос только один раз в 24 часа. И я согласен с вами, это должна быть доступность, а не действительность.
Ответ №1:
Многие сайты блокируют очевидную активность ботов. URL-адрес British Airways, который вы показываете, работает для меня, если я задам допустимый заголовок запроса агента пользователя:
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0";
Имейте в виду, что 200 OK-это не единственный ответ, который означает, что URL-адрес действителен, и ваш метод тестирования в лучшем случае всегда будет ненадежным. Возможно, вам придется сузить свое определение того, что означает допустимый URL-адрес, или, по крайней мере, ожидать, что ситуация будет меняться от сайта к сайту.
Комментарии:
1. Для второго URL-адреса это работает. Странно думать, что первое терпит неудачу…
2. @Rogier Да, серверы могут проверять запрос и отвечать так, как они хотят, основываясь на том, что они «видят». Как правило, сайты хотят, чтобы браузеры получали доступ только к их страницам. Кстати, было бы более эффективно выполнить запрос HEAD вместо GET, если вы просто хотите проверить, существует ли страница.