Я делаю простую программу на Visual C # 2005, которая ищет символ акций на Yahoo! Finance загружает исторические данные, а затем строит историю цен для указанного тикерного символа.
Я знаю точный URL-адрес, который мне нужен для получения данных, и если пользователь вводит существующий символ тикера (или хотя бы один с данными из Yahoo! Finance), он работает отлично. Однако у меня возникает ошибка времени выполнения, если пользователь создает символ тикера, поскольку программа пытается извлечь данные с несуществующей веб-страницы.
Я использую класс WebClient и функцию DownloadString. Я просмотрел все другие функции-члены класса WebClient, но не нашел ничего, что можно было бы использовать для проверки URL-адреса.
Как я могу это сделать?
c#
.net
url-validation
Дэниел Уолтрип
источник
источник
Ответы:
Вы могли бы отправить запрос «HEAD», а не «GET»?
(править) - лол! Похоже, я делал это раньше !; изменен на вики, чтобы избежать обвинений в репутации. Итак, чтобы протестировать URL без затрат на загрузку контента:
Вы бы
try
/catch
вокруг,DownloadString
чтобы проверить наличие ошибок; Нет ошибки? Это существует...С C # 2.0 (VS2005):
и
источник
Вот еще одна реализация этого решения:
От: http://www.dotnetoughtts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
источник
Эти решения довольно хороши, но они забывают, что могут быть другие коды состояния, кроме 200 OK. Это решение, которое я использовал в производственных средах для мониторинга состояния и т.п.
Если на целевой странице есть перенаправление URL-адреса или какое-либо другое условие, возврат будет истинным с использованием этого метода. Кроме того, GetResponse () вызовет исключение, и, следовательно, вы не получите для него StatusCode. Вам нужно перехватить исключение и проверить наличие ProtocolError.
Любой код статуса 400 или 500 вернет false. Все остальные вернут истину. Этот код легко изменить в соответствии с вашими потребностями для конкретных кодов состояния.
источник
HttpWebRequest
не нравится, если вы не.Close()
используетеresponse
объект до того, как попытаетесь загрузить что-нибудь еще. Потребовались часы, чтобы найти его!HttpWebResponse
объект должен быть заключен вusing
блок, поскольку он реализует,IDisposable
что также обеспечит закрытие соединения. Это может вызвать проблемы, с которыми столкнулся @jbeldock.Head
может не поддерживаться на этом ресурсе, хотяGet
может быть. Вместо этого он должен был выбросить 405.Если я правильно понял ваш вопрос, вы можете использовать небольшой метод вроде этого, чтобы получить результаты вашего URL-теста:
Вы можете обернуть приведенный выше код в метод и использовать его для проверки. Я надеюсь, что это ответ на ваш вопрос.
источник
Попробуйте это (убедитесь, что вы используете System.Net):
Когда вызывается функция checkWebsite (), она пытается получить исходный код переданного в нее URL. Если он получает исходный код, он возвращает true. Если нет, возвращается false.
Пример кода:
источник
Вот еще вариант
источник
Это решение кажется простым:
источник
источник
У меня есть более простой способ определить, действителен ли URL-адрес.
источник
Я всегда обнаруживал, что исключения обрабатываются намного медленнее.
Возможно, менее интенсивный способ даст лучший и более быстрый результат?
Тогда просто используйте:
источник
Веб-серверы отвечают кодом состояния HTTP, указывающим результат запроса, например, 200 (иногда 202) означает успех, 404 - не найден и т. Д. (См. Здесь ). Предполагая, что адресная часть URL-адреса верна, и вы не получаете тайм-аут сокета, исключение, скорее всего, сообщает вам, что код состояния HTTP отличен от 200. Я бы предложил проверить класс исключения и посмотреть, несет ли исключение код состояния HTTP.
IIRC - рассматриваемый вызов вызывает исключение WebException или потомка. Проверьте имя класса, чтобы узнать, какой из них, и заключите вызов в блок try, чтобы перехватить условие.
источник
Следуя уже приведенным примерам, я бы сказал, что лучше всего также обернуть ответ таким использованием
источник