이러한 솔루션은 꽤 좋지만 200 OK 이외의 다른 상태 코드가있을 수 있다는 사실을 잊고 있습니다. 이것은 상태 모니터링 등을 위해 프로덕션 환경에서 사용한 솔루션입니다.
URL 리디렉션 또는 대상 페이지에 다른 조건이있는 경우이 메서드를 사용하면 반환이 true가됩니다. 또한 GetResponse ()는 예외를 throw하므로 이에 대한 StatusCode를 얻지 못합니다. 예외를 트랩하고 ProtocolError를 확인해야합니다.
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;
}