나는 아마도 여기에서 분명한 것을 놓치고있을 것입니다.
메시지 문자열에 포함 HttpClient
된 throws HttpRequestException
를 사용 하고 있습니다 StatusCode
.
어떻게 액세스 할 수 StatusCode
있습니까?
편집 : 더 많은 정보, 나는이 질문을 서둘러 썼습니다.
HttpClient
WebApi 프로젝트 내에서 다른 API에 액세스 하는 데 사용 하고 있습니다. 예, 제가 전화하는 이유를 알고 EnsureSuccessStatusCode()
있습니다. 404 및 403과 같은 일부 오류를 다운 스트림으로 전파하고 싶습니다.
모든 나는 일관되게 변환 원한 HttpRequestException
으로 HttpResponseException
사용자 정의를 사용하여 ExceptionFilterAttribute
.
안타깝게도 HttpRequestException
메시지 외에 사용할 수있는 추가 정보는 없습니다. 나는 StatusCode
원시 (int 또는 enum) 형태 로 밝히기 를 바랬습니다 .
다음 중 하나를 수행 할 수있는 것 같습니다.
- 메시지를 사용하여 상태 코드 전환 (bleh)
- 또는 내 버전의 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를 읽어야한다면 두 가지 해결책이있을 수 있습니다.
- 여기에 설명 된 사용자 지정 예외로 HttpResponseMessage를 확장했습니다.
- 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)