Estas soluciones son bastante buenas, pero olvidan que puede haber otros códigos de estado además de 200 OK. Esta es una solución que he usado en entornos de producción para monitorear el estado y demás.
Si hay una redirección de URL o alguna otra condición en la página de destino, la devolución será verdadera usando este método. Además, GetResponse () lanzará una excepción y, por lo tanto, no obtendrá un StatusCode para ella. Debe capturar la excepción y verificar un ProtocolError.
Cualquier código de estado 400 o 500 devolverá falso. Todos los demás vuelven verdaderos. Este código se modifica fácilmente para adaptarse a sus necesidades de códigos de estado específicos.
/// <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;
}