Các giải pháp này khá tốt, nhưng họ đang quên rằng có thể có các mã trạng thái khác hơn 200 OK. Đây là một giải pháp mà tôi đã sử dụng trên các môi trường sản xuất để theo dõi trạng thái và như vậy.
Nếu có một chuyển hướng url hoặc một số điều kiện khác trên trang đích, kết quả trả về sẽ là true khi sử dụng phương pháp này. Ngoài ra, GetResponse () sẽ ném ra một ngoại lệ và do đó bạn sẽ không nhận được Mã trạng thái cho nó. Bạn cần bẫy ngoại lệ và kiểm tra lỗi ProtocolError.
Bất kỳ mã trạng thái 400 hoặc 500 nào sẽ trả về false. Tất cả những người khác trả về true. Mã này dễ dàng được sửa đổi để phù hợp với nhu cầu của bạn đối với các mã trạng thái cụ thể.
/// <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;
}