2012-04-10 18 views
31

私はHttpWebRequestを使用してURLの存在を確認しようとしています。私は基本的にこれを行ういくつかの例を見つけました:URLは実際に壊れている場合なぜHttpWebRequestはHttpStatusCode.NotFoundを返す代わりに例外をスローしますか?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.Method = "HEAD"; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    return response.StatusCode; 
} 

しかし、それは代わりに例外を投げ、応答を返さないです。

私はこれに私のコードを変更:

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ステータスコードで応答を返す代わりに、リクエストが例外をスローするのはなぜですか。

答えて

54

ウェブページがステータスコードを頻繁に使用し、すべてがエラーではない場合、これはかなり迷惑になることがあります。身体の処理をかなり苦痛にさせることがあります。個人的に私はこの拡張メソッドを使用して応答を取得します。

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; 
     } 
    } 
} 
+6

これは、.Net Frameworkの作者の部分でこの悪いデザインの選択肢からHttpWebRequest/Responseを使用してコードを保存するための作業ではありませんが、正しい解決策は、4xxと5xxのステータスコードを投げないHttpClientを使用することです。例外は例外的な状況を想定したものであり、それをキャッチすることだけを投げて、パフォーマンスが悪くて悪いように進んでいます。 https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx –

+1

これは当てはまりません。私はプロジェクトでHttpClientを使用していますが、404ステータスコードを返す存在しないURLを呼び出すと、クライアントは404ステータスコードで応答を返す代わりに例外をスローしています。これを防ぐためにhttpclientを使用するには余分なステップがありますか? – SelAromDotNet

2

どうしてですか?両方とも有効なデザインオプションであり、HttpWebRequestはこのように動作するように設計されています。

+0

は限りコードが4xxの –

+4

あるときに、レスポンスヘッダーと本文を読むことができるように私は私がこれを見たコードサンプルのいずれも考慮にこれを取っていないので、私は、混乱していたと思います。多くの人はtry/catchを持っていなくて、おそらく私が何かを見逃していて、例外を投げずにステータスを取得する方法があるのだろうかと思っていました。ステータスコードがそのようなステータスを処理するように設計されている場合は、全体的な例外をスローするのは直観的ではないようです。 – SelAromDotNet

+1

「もちろんxxxが彼のウェブサイトに書いたコード行をテストした」と思うと、間違っていると分かります:) –

関連する問題