C # Как я могу проверить, если URL существует / является действительным? - PullRequest
105 голосов
/ 29 мая 2009

Я делаю простую программу в Visual C # 2005, которая ищет символ акций на Yahoo! Финансирование, загрузка исторических данных, а затем построение истории цен для указанного символа тикера.

Я знаю точный URL-адрес, который мне нужен для получения данных, и если пользователь вводит существующий символ тикера (или хотя бы один с данными на Yahoo! Finance), он отлично работает. Однако у меня возникает ошибка во время выполнения, если пользователь создает символ тикера, поскольку программа пытается извлечь данные с несуществующей веб-страницы.

Я использую класс WebClient и использую функцию DownloadString. Я просмотрел все другие функции-члены класса WebClient, но не увидел ничего, что я мог бы использовать для проверки URL.

Как я могу это сделать?

Ответы [ 12 ]

0 голосов
/ 16 сентября 2016

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

    public bool IsValidUrl(string url)
    {
         try
         {
             var request = WebRequest.Create(url);
             request.Timeout = 5000;
             request.Method = "HEAD";

             using (var response = (HttpWebResponse)request.GetResponse())
             {
                response.Close();
                return response.StatusCode == HttpStatusCode.OK;
            }
        }
        catch (Exception exception)
        { 
            return false;
        }
   }
0 голосов
/ 29 мая 2009

Веб-серверы отвечают кодом состояния HTTP, указывающим на результат запроса, например, 200 (иногда 202) означает успех, 404 - не найдено и т. Д. (См. здесь ). Предполагая, что адресная часть URL-адреса сервера верна, и вы не получаете тайм-аут сокета, исключение скорее всего говорит о том, что код состояния HTTP отличен от 200. Я бы предложил проверить класс исключения и посмотреть, несет ли исключение код статуса HTTP.

IIRC - рассматриваемый вызов вызывает исключение WebException или его потомка. Проверьте имя класса, чтобы узнать, какой из них, и оберните вызов в блок try, чтобы перехватить условие.

...