17

これは私が混乱している一般的な質問です。REST リクエストが行われると、エラーがWebException. あるケースではHttpRequestException、HTTP ステータス コードを取得できません。

私はこのようなものに慣れていませんが、これらの違いは何ですか? なぜ2種類あるの?別のものとは対照的に、いつ慣れますか?

WebExceptionうまくいくようです。HttpRequestExceptionステータスコードを(メッセージで)知っている非常に弱いバージョンのようですが、それが何であるかを明示的に教えてくれません。

編集: 私はを使用していHttpClientます。具体的にはclient.GetStreamAsync().

4

3 に答える 3

19

次の 3 つの異なる障害シナリオがあります。

a) サーバーまたはプロキシに接続できませんでした。この場合、HttpRequestException がスローされます。サーバーがダウンしていて、フィドラーを実行している場合、この例外は表示されず、5XX ステータス コードが返されることに注意してください。

b) ネットワーク ストリームの読み取り/書き込み中に、IOException が発生する何らかの中断が発生します。

c) 4XX/5XX ステータス コードの HttpStatusCode を含む応答が返されます。クライアント アプリケーションが response.EnsureSuccessStatusCode() の呼び出しを選択した場合、HttpRequestException がスローされます。

EnsureSuccessStatusCode を呼び出すことにした場合は、成功/失敗であったという事実以外のステータス コードを気にしないという明確な決定を行っています。

例外をバブルアップして後でステータス コードを処理する必要がある場合は、EnsureSuccessStatusCode を置き換える独自の拡張メソッドを作成し、ステータス コードを格納できる独自の例外を作成することをお勧めします。または、できれば、実行したい修正アクションに基づいて、ステータス コードをいくつかの異なる例外の 1 つに変換します。

于 2014-03-24T13:56:05.363 に答える