私はおそらくここで明らかな何かを見逃しています。
メッセージ文字列にHttpClient
を含むHttpRequestException
をスローするStatusCode
を使用しています。
StatusCode
にアクセスするにはどうすればよいですか?
編集:詳細は、ラッシュでこの質問を書きました。
HttpClient
を使用して、WebApiプロジェクト内の別のAPIにアクセスしています。はい、私はEnsureSuccessStatusCode()
を呼び出している理由を知っています。 404や403など、いくつかのエラーをダウンストリームに伝えたい。
私が望んだのは、カスタムHttpRequestException
を使用してHttpResponseException
をExceptionFilterAttribute
に一貫して変換することだけでした。
残念ながら、HttpRequestException
には、メッセージ以外に使用できる追加情報はありません。 StatusCode
を未加工(intまたはenum)形式で発見したいと思っていました。
私ができるように見えます:
ステータスコードは、文字列の一部としてHttpRequestException
に渡されたため、このような例外だけでは回復できません。
System.Net.Http
の設計では、例外を待つ代わりにHttpResponseMessage.StatusCode
にアクセスする必要があります。
http://msdn.Microsoft.com/en-us/library/system.net.http.httpresponsemessage(v = vs.110).aspx
Microsoftガイド を使用している場合は、HttpResponseMessage.EnsureSucessStatusCode
を呼び出すように求められる理由を明確に理解してください。その関数を呼び出さなければ、例外はないはずです。
その価値のために、この男は何か巧妙なことをしました: 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;
}
他の人も述べたように、HttpRequestExceptionからStatusCodeを取得することはお勧めできません。HttpResponseMessage.IsSuccessStatusCodeを確認した後、HttpResponseMessage.StatusCodeで事前に同じことを行うことができます。
とにかく、何らかの制約/要件のためにステータスコードを読み取る必要がある場合、2つの解決策があります
以下は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)