Проверка существования URL - HTTP-запрос всегда возвращает исключение

Есть множество сообщений о том, как проверить, является ли URL действительным. Все они имеют в основном один и тот же код, который, кажется, работает для всех, но не для меня, и я не понимаю, почему.

    public static bool ifURLexists(string url) 
    {

         try 
         {
              var request = WebRequest.Create(url) as HttpWebRequest;
              request.Method = "HEAD";
              //response ALWAYS throws an exception
              using (var response = (HttpWebResponse)request.GetResponse()) 
              {
                return response.StatusCode == HttpStatusCode.OK;
              }
         }
         catch 
         {
            return false;
         }
    }

Я протестировал метод с такими параметрами, как " http://www.nonexistingwebsiteblabla.com/" и " http://www.google.com/". Независимо от того, вставляю ли я существующий или несуществующий URL, я получаю исключение WebException в этой строке:

    using (var response = (HttpWebResponse)request.GetResponse())

Почему это может не работать?

1 ответ

Решение

Проверьте статус WebException.StatusЭто позволит вам узнать, какое конкретное веб-исключение произошло.

Обновление: попробуйте изменить request.Method = "HEAD";ПОЛУЧИТЬ и попробовать.

Попробуйте с недоступным (404) URL, сравните статус. Проверьте, не блокирует ли что-либо ваш запрос.

Это то, как я управляю в своем коде, я обрабатываю, используя только определенный статус ftp.'CommStatus' - это ENUM с кодами ошибок, который доступен во всем приложении.

catch (WebException ex)
        {
            FtpWebResponse response = (FtpWebResponse)ex.Response;               
          switch(response.StatusCode)
            {
                case FtpStatusCode.ActionNotTakenFileUnavailable:
                    return CommStatus.PathNotFound; 
                case FtpStatusCode.NotLoggedIn:
                    return CommStatus.AuthenticationError;
                default: return CommStatus.UnhandledException;

            }


        }

Ниже доступно состояние WebException.

CacheEntryNotFound
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Указанная запись в кэше не найдена.

ConnectFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Не удалось связаться с удаленной точкой обслуживания на транспортном уровне.

ConnectionClosed
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Связь была преждевременно закрыта.

KeepAliveFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Соединение для запроса, в котором указан заголовок Keep-alive, было неожиданно закрыто.

MessageLengthLimitExceeded
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Получено сообщение, превышающее указанный лимит при отправке запроса или получении ответа от сервера.

NameResolutionFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Служба распознавания имен не смогла разрешить имя хоста.

Ожидание Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Внутренний асинхронный запрос ожидает рассмотрения.

PipelineFailure Этот API-интерфейс поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Запрос был в виде конвейерного запроса, и соединение было закрыто до получения ответа.

ProtocolError
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Ответ, полученный от сервера, был завершен, но указал ошибку уровня протокола. Например, ошибка протокола HTTP, такая как 401 Доступ запрещен, будет использовать этот статус.

ProxyNameResolutionFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Служба распознавания имен не смогла разрешить имя прокси-хоста.

ReceiveFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Полный ответ не был получен с удаленного сервера.

RequestCanceled Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Запрос был отменен, вызван метод WebRequest.Abort или произошла неклассифицируемая ошибка. Это значение по умолчанию для статуса.

RequestProhibitedByCachePolicy
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Запрос не был разрешен политикой кэширования. Как правило, это происходит, когда запрос не кэшируется, и действующая политика запрещает отправку запроса на сервер. Вы можете получить это состояние, если метод запроса подразумевает наличие тела запроса, метод запроса требует прямого взаимодействия с сервером или запрос содержит условный заголовок.

RequestProhibitedByProxy
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Этот запрос не был разрешен прокси.

SecureChannelFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Произошла ошибка при установлении соединения с использованием SSL.

SendFailure Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Полный запрос не может быть отправлен на удаленный сервер.

ServerProtocolViolation Этот API-интерфейс поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Ответ сервера не был действительным ответом HTTP.

Успех Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Ошибка не обнаружена.

Тайм-аут Этот API-интерфейс поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. В течение периода ожидания запроса не было получено никакого ответа.

TrustFailure
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Сертификат сервера не может быть проверен.

Неизвестная ошибка
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода. Произошло исключение неизвестного типа.

Подробнее здесь: https://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus(v=vs.110).aspx

Также вы можете использовать эту опцию.

IPHostEntry ipHost = Dns.GetHostEntry(url);
Другие вопросы по тегам