Проверьте, является ли URL-адрес действительным с помощью HttpWebRequest

#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, если вы просто хотите проверить, существует ли страница.