HttpWebRequestを使用してUrlの存在を確認しようとしています。私は基本的にこれを行ういくつかの例を見つけました:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.Method = "HEAD";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
return response.StatusCode;
}
ただし、URLが実際に壊れている場合、応答を返さず、代わりに例外をスローします。
コードを次のように変更しました。
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.Method = "HEAD";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
return response.StatusCode;
}
}
catch (System.Net.WebException ex)
{
var response = ex.Response as HttpWebResponse;
return response == null ? HttpStatusCode.InternalServerError : response.StatusCode;
}
それは最終的に私がしたいことをするようです。
しかし、NotFoundステータスコードで応答を返すのではなく、リクエストが例外をスローするのはなぜですか?
これは、Webページがステータスコードを頻繁に使用し、それらのすべてがエラーではない場合、非常に面倒です。体の処理が非常に苦痛になる可能性があります。個人的には、この拡張メソッドを使用して応答を取得します。
public static class HttpWebResponseExt
{
public static HttpWebResponse GetResponseNoException(this HttpWebRequest req)
{
try
{
return (HttpWebResponse)req.GetResponse();
}
catch (WebException we)
{
var resp = we.Response as HttpWebResponse;
if (resp == null)
throw;
return resp;
}
}
}
何故なの?どちらも有効な設計オプションであり、HttpWebRequestはこのように機能するように設計されています。