web-dev-qa-db-ja.com

HttpRequestExceptionからStatusCodeを取得するにはどうすればよいですか?

私はおそらくここで明らかな何かを見逃しています。

メッセージ文字列にHttpClientを含むHttpRequestExceptionをスローするStatusCodeを使用しています。

StatusCodeにアクセスするにはどうすればよいですか?


編集:詳細は、ラッシュでこの質問を書きました。

HttpClientを使用して、WebApiプロジェクト内の別のAPIにアクセスしています。はい、私はEnsureSuccessStatusCode()を呼び出している理由を知っています。 404や403など、いくつかのエラーをダウンストリームに伝えたい。

私が望んだのは、カスタムHttpRequestExceptionを使用してHttpResponseExceptionExceptionFilterAttributeに一貫して変換することだけでした。

残念ながら、HttpRequestExceptionには、メッセージ以外に使用できる追加情報はありません。 StatusCodeを未加工(intまたはenum)形式で発見したいと思っていました。

私ができるように見えます:

  1. メッセージを使用してステータスコード(bleh)を切り替えます
  2. または、EnsureSuccessStatusCodeのバージョンを作成し、実際に使用可能な例外をスローします。
63
Kugel

ステータスコードは、文字列の一部としてHttpRequestExceptionに渡されたため、このような例外だけでは回復できません。

System.Net.Httpの設計では、例外を待つ代わりにHttpResponseMessage.StatusCodeにアクセスする必要があります。

http://msdn.Microsoft.com/en-us/library/system.net.http.httpresponsemessage(v = vs.110).aspx

Microsoftガイド を使用している場合は、HttpResponseMessage.EnsureSucessStatusCodeを呼び出すように求められる理由を明確に理解してください。その関数を呼び出さなければ、例外はないはずです。

27
Lex Li

その価値のために、この男は何か巧妙なことをしました: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws -exception-httprequestexception-webexception-the-remote-name?forum = csharpgeneral

例外ステータスプロパティが必要な場合、これを行うことができます。

catch (HttpRequestException requestException)
{
    if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure)
    {
        return true;
    }

    return false;
}
21
Steve

他の人も述べたように、HttpRequestExceptionからStatusCodeを取得することはお勧めできません。HttpResponseMessage.IsSuccessStatusCodeを確認した後、HttpResponseMessage.StatusCodeで事前に同じことを行うことができます。

とにかく、何らかの制約/要件のためにステータスコードを読み取る必要がある場合、2つの解決策があります

  1. 説明したカスタム例外でHttpResponseMessageを拡張しました here
  2. HttpRequestException.ToStringをハックしてStatusCodeを取得します。これは、メッセージがStatusCodeおよびRepharseによって修正された一定の投稿であるためです。

以下はSystem.Net.Http.HttpResponseMessageのコードです。SR.net_http_message_not_success_statuscode= "応答ステータスコードは成功を示していません:{0}({1})。

public HttpResponseMessage EnsureSuccessStatusCode()
    {
        if (!this.IsSuccessStatusCode)
        {
            if (this.content != null)
            {
                this.content.Dispose();
            }
            throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[]
            {
                (int)this.statusCode,
                this.ReasonPhrase
            }));
        }
        return this;
    }

これは私のために働いた

var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
2