C# как я могу проверить, существует ли URL-адрес/действителен?
Я делаю простую программу в visual c# 2005, которая ищет символ акции на Yahoo! Финансы, загружает исторические данные, а затем строит историю цен для указанного символа тикера.
Я знаю точный URL, который мне нужно получить данные, и если пользователь вводит существующий символ тикера (или, по крайней мере, один с данными на Yahoo! Финансы) он работает отлично. Однако у меня есть ошибка времени выполнения, если пользователь составляет символ тикера, так как программа пытается вытащить данные с несуществующей веб-страницы.
Я использую класс WebClient и использую функцию DownloadString. Я просмотрел все другие функции-члены класса WebClient, но не увидел ничего, что я мог бы использовать для тестирования URL.
Как я могу это сделать?
12 ответов:
вы могли бы выдать "голова" запрос, а не "сделать"?
(edit) - lol! Похоже, я сделать это перед!; изменен на wiki, чтобы избежать обвинений в повторном сборе. Таким образом, чтобы проверить URL-адрес без затрат на загрузку контента:
// using MyClient from linked post using(var client = new MyClient()) { client.HeadOnly = true; // fine, no content downloaded string s1 = client.DownloadString("http://google.com"); // throws 404 string s2 = client.DownloadString("http://google.com/silly"); }вы
try/catchвокругDownloadStringчтобы проверить наличие ошибок; нет ошибки? Она существует...
С C# 2.0 (VS2005):
private bool headOnly; public bool HeadOnly { get {return headOnly;} set {headOnly = value;} }и
using(WebClient client = new MyClient()) { // code as before }
вот еще одна реализация этого решения:
using System.Net; /// /// Checks the file exists or not. /// /// The URL of the remote file. /// True : If the file exits, False if file not exists private bool RemoteFileExists(string url) { try { //Creating the HttpWebRequest HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //Setting the Request method HEAD, you can also use GET too. request.Method = "HEAD"; //Getting the Web Response. HttpWebResponse response = request.GetResponse() as HttpWebResponse; //Returns TRUE if the Status code == 200 response.Close(); return (response.StatusCode == HttpStatusCode.OK); } catch { //Any exception will returns false. return false; } }от: http://www.dotnetthoughts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
эти решения довольно хороши, но они забывают, что могут быть другие коды состояния, чем 200 OK. Это решение, которое я использовал в производственных средах для мониторинга состояния и такие.
если есть перенаправление url или какое-либо другое условие на целевой странице, возврат будет истинным с помощью этого метода. Кроме того, GetResponse() выдаст исключение, и поэтому вы не получите для него StatusCode. Вам нужно поймать исключение и проверить наличие Протокольная ошибка.
любой код состояния 400 или 500 вернет false. Все остальные возвращают истину. Этот код легко модифицируется в соответствии с вашими потребностями для определенных кодов статуса.
/// <summary> /// This method will check a url to see that it does not return server or protocol errors /// </summary> /// <param name="url">The path to check</param> /// <returns></returns> public bool UrlIsValid(string url) { try { HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; request.Timeout = 5000; //set the timeout to 5 seconds to keep the user from waiting too long for the page to load request.Method = "HEAD"; //Get only the header information -- no need to download any content using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { int statusCode = (int)response.StatusCode; if (statusCode >= 100 && statusCode < 400) //Good requests { return true; } else if (statusCode >= 500 && statusCode <= 510) //Server Errors { //log.Warn(String.Format("The remote server has thrown an internal error. Url is not valid: {0}", url)); Debug.WriteLine(String.Format("The remote server has thrown an internal error. Url is not valid: {0}", url)); return false; } } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) //400 errors { return false; } else { log.Warn(String.Format("Unhandled status [{0}] returned for url: {1}", ex.Status, url), ex); } } catch (Exception ex) { log.Error(String.Format("Could not test url {0}.", url), ex); } return false; }
Если я правильно понимаю ваш вопрос, вы можете использовать небольшой метод, как это, чтобы дать вам результаты вашего теста URL:
WebRequest webRequest = WebRequest.Create(url); WebResponse webResponse; try { webResponse = webRequest.GetResponse(); } catch //If exception thrown then couldn't get response from address { return 0; } return 1;можно завернуть приведенный выше код в метод и использовать его для проверки. Я надеюсь, что это ответ на вопрос, который вы спрашивали.
попробуйте это (убедитесь, что вы используете System.Net):
public bool checkWebsite(string URL) { try { WebClient wc = new WebClient(); string HTMLSource = wc.DownloadString(URL); return true; } catch (Exception) { return false; } }когда вызывается функция checkWebsite (), она пытается получить исходный код URL-адрес, переданный в него. Если он получает исходный код, он возвращает true. Если нет, она возвращает значение false.
Пример Кода:
//The checkWebsite command will return true: bool websiteExists = this.checkWebsite("https://www.google.com"); //The checkWebsite command will return false: bool websiteExists = this.checkWebsite("https://www.thisisnotarealwebsite.com/fakepage.html");
вот еще один вариант
public static bool UrlIsValid(string url) { bool br = false; try { IPHostEntry ipHost = Dns.Resolve(url); br = true; } catch (SocketException se) { br = false; } return br; }
Это решение кажется легко следовать:
public static bool isValidURL(string url) { WebRequest webRequest = WebRequest.Create(url); WebResponse webResponse; try { webResponse = webRequest.GetResponse(); } catch //If exception thrown then couldn't get response from address { return false ; } return true ; }
У меня есть более простой способ определить погоду url-адрес действителен.
if (Uri.IsWellFormedUriString(uriString, UriKind.RelativeOrAbsolute)) { //... }
веб-серверы отвечают кодом состояния HTTP, указывающим на результат запроса, например, 200 (иногда 202) означает успех, 404 - не найден и т. д. (см. здесь). Предполагая, что часть адреса сервера URL-адреса верна, и вы не получаете тайм-аут сокета, исключение, скорее всего, говорит вам, что код состояния HTTP был отличным от 200. Я бы предложил проверить класс исключения и посмотреть, несет ли исключение код состояния HTTP.
IIRC-The вызов в вопросе вызывает WebException или потомок. Проверьте имя класса, чтобы увидеть, какой из них и оберните вызов в блок try, чтобы перехватить условие.
следуя из уже приведенных примеров, я бы сказал, что лучше всего также обернуть ответ в такое использование
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; } }
Я всегда находил, что исключения гораздо медленнее обрабатываются.
возможно, менее интенсивный способ даст лучший, более быстрый результат?
public bool IsValidUri(Uri uri) { using (HttpClient Client = new HttpClient()) { HttpResponseMessage result = Client.GetAsync(uri).Result; HttpStatusCode StatusCode = result.StatusCode; switch (StatusCode) { case HttpStatusCode.Accepted: return true; case HttpStatusCode.OK: return true; default: return false; } } }затем просто использовать:
IsValidUri(new Uri("http://www.google.com/censorship_algorithm"));
WebRequest request = WebRequest.Create("http://www.google.com"); try { request.GetResponse(); } catch //If exception thrown then couldn't get response from address { MessageBox.Show("The URL is incorrect");` }
Comments