HttpRequestException에서 StatusCode를 어떻게 얻습니까?


87

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

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

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


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

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

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

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

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

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

1
코드를 보여줄 수 있습니까?
Hamlet Hakobyan 2014 년

1
"상태 코드에 액세스"란 무엇을 의미합니까?
Marco

예외가 발생하는 위치를 알려주는 코드를 보여줍니다.
덴마크어

5
이 질문의 제목에 대해 명확하지 않은 것은 무엇입니까?
Kugel 2014 년

1
이 문제에 대한 적절한 해결책을 찾았습니까? 공유하십시오
Siddharth Pandey

답변:


37

상태 코드는 문자열의 일부로 전달 HttpRequestException되었으므로 이러한 예외에서만 복구 할 수 없습니다.

의 디자인 에서는 예외를 기다리는 대신 System.Net.Http액세스해야합니다 HttpResponseMessage.StatusCode.

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

지금 Microsoft 가이드를 따르고 있는 경우 전화를 요청하는 이유를 명확하게 이해해야합니다 HttpResponseMessage.EnsureSucessStatusCode. 해당 함수를 호출하지 않으면 예외가 없어야합니다.


2
여기서 교차 절단 문제를 해결하려고합니다. 내 편집을보세요. 더 나은 해결책이있을 수 있습니다.
Kugel 2014 년

1
메시지 텍스트를 제거하지 않고이 작업을 수행하는 방법을 볼 수 없으므로 HttpClient.GetStreamAsync (url) 사용에 적합합니까?
상원 의원

1
@TheSenator HttpResponseMessage를 반환하려면 GetAsync (uri) 또는 PostAsync (uri)를 호출해야합니다. 응답을 읽거나 GetStreamAsync와 같은 편리한 메서드를 사용하여 응답의 내용을 얻으려고하면 내부에서 VerifySuccessStatusCode가 호출됩니다.
odyth

6
오류를 유용하게 처리 할 수없는 예외를 던지면 편리 메서드가 사용 가능한 이유가 무엇인지에 대한 분명한 질문을 던집니다. if 및 throw 문으로 코드를 버리는 것은 해결책이 아니므로 여기에서 말한 바에 따르면 현재 정답은 편의 메서드 또는 ensureSuccessStatusCode를 직접 다시 구현해야한다는 것입니다.
Neutrino 2011

1
말한 것보다 쉽습니다. 타사 코드에서 예외가 발생할 수 있습니다. 예를 들어 자동 생성 된 swagger 클라이언트.
user2555515

27

어떻게 그 가치를 들면,이 사람이 영리한 짓을 : 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;
}

14
기능을 래핑하고 예외를 발생시키는 라이브러리를 사용하도록 강요당하는 경우와 같이 응답에 액세스 할 수없는 경우도 있습니다.
Kell

4
.net 코어 2.1 HttpClient에는 GetAsync () 및 GetStreamAsync ()가 있습니다. 첫 번째는 응답을 반환하고 다른 하나는 내부적으로 ensureSucessStatusCode를 호출하고 HttpRequestException을 발생시킵니다. 불일치를 이해하지 못해 오류 처리가 어렵지만이 해결 방법에 감사드립니다.
smurtagh

2
.NET Core 3.1.5 실행 requestException.InnerException은 null이므로 작동하지 않습니다
Ohad Schneider

3

다른 사람들도 언급했듯이 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;
    }

4
특정 형식의 오류 문자열은 코드 냄새이므로 논리에 의존해서는 안됩니다.
user1496062

1
@ user1496062 외부 시스템에서 오류가 발생하면 대안이없는 경우가 많습니다.
Ian Warburton

1

이것은 나를 위해 일했습니다

var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.