[c#] HttpRequestException에서 StatusCode를 어떻게 얻습니까?

나는 아마도 여기에서 분명한 것을 놓치고있을 것입니다.

메시지 문자열에 포함 HttpClient된 throws HttpRequestException를 사용 하고 있습니다 StatusCode.

어떻게 액세스 할 수 StatusCode있습니까?


편집 : 더 많은 정보, 나는이 질문을 서둘러 썼습니다.

HttpClientWebApi 프로젝트 내에서 다른 API에 액세스 하는 데 사용 하고 있습니다. 예, 제가 전화하는 이유를 알고 EnsureSuccessStatusCode()있습니다. 404 및 403과 같은 일부 오류를 다운 스트림으로 전파하고 싶습니다.

모든 나는 일관되게 변환 원한 HttpRequestException으로 HttpResponseException사용자 정의를 사용하여 ExceptionFilterAttribute.

안타깝게도 HttpRequestException메시지 외에 사용할 수있는 추가 정보는 없습니다. 나는 StatusCode원시 (int 또는 enum) 형태 로 밝히기 를 바랬습니다 .

다음 중 하나를 수행 할 수있는 것 같습니다.

  1. 메시지를 사용하여 상태 코드 전환 (bleh)
  2. 또는 내 버전의 ensureSuccessStatusCode를 만들고 실제로 사용할 수있는 예외를 발생시킵니다.



답변

상태 코드는 문자열의 일부로 전달 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를 사용하여 사전에 동일한 작업을 수행 할 수 있습니다.

어쨌든 제약 / 요구 사항으로 인해 StatusCode를 읽어야한다면 두 가지 해결책이있을 수 있습니다.

  1. 여기에 설명 된 사용자 지정 예외로 HttpResponseMessage를 확장했습니다.
  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)


답변