Prawdopodobnie brakuje mi tutaj czegoś oczywistego.
Używam HttpClient
rzutów, HttpRequestException
które zawierają StatusCode
w ciągu Message.
Jak mogę uzyskać do tego dostęp StatusCode
?
Edycja : Więcej informacji, napisałem to pytanie w pośpiechu.
Używam HttpClient
dostępu do innego interfejsu API w moim projekcie WebApi. Tak, wiem, dlaczego dzwonię EnsureSuccessStatusCode()
. Chcę propagować niektóre błędy w dół, takie jak 404 i 403.
Jedyne, czego chciałem, to konsekwentne przekształcanie się HttpRequestException
w HttpResponseException
używanie niestandardowych ExceptionFilterAttribute
.
Niestety HttpRequestException
oprócz wiadomości nie zawiera żadnych dodatkowych informacji, których mógłbym użyć. Miałem nadzieję, że uda mi się to odkryć StatusCode
w formie surowej (int lub enum).
Wygląda na to, że mogę:
- Użyj wiadomości, aby zmienić kod stanu (bleh)
- Lub utwórz moją wersję ChooseSuccessStatusCode i zgłoś wyjątek, który jest faktycznie użyteczny.
Odpowiedzi:
Kod stanu został przekazany jako część ciągu do,
HttpRequestException
więc nie można go odzyskać tylko z takich wyjątków.Projekt
System.Net.Http
wymaga dostępuHttpResponseMessage.StatusCode
zamiast czekania na wyjątek.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Jeśli teraz postępujesz zgodnie z instrukcjami firmy Microsoft , upewnij się, że dokładnie rozumiesz, dlaczego prosi Cię o telefon
HttpResponseMessage.EnsureSucessStatusCode
. Jeśli nie wywołasz tej funkcji, nie powinno być żadnych wyjątków.źródło
Na ile to warte, ten facet zrobił coś sprytnego: 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
W przypadku, gdy potrzebowałem właściwości statusu wyjątku, mogę to zrobić:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }
źródło
requestException.InnerException
jest zerowe, więc to nie zadziałaJak wspomnieli inni, nie jest dobrą praktyką pobieranie StatusCode z HttpRequestException, to samo można zrobić wcześniej z HttpResponseMessage.StatusCode po sprawdzeniu HttpResponseMessage.IsSuccessStatusCode
Tak czy inaczej, jeśli z powodu jakiegoś ograniczenia / wymagania trzeba czytać StatusCode, mogą być dwa rozwiązania
Poniżej znajduje się kod w System.Net.Http.HttpResponseMessage Where SR.net_http_message_not_success_statuscode = "Kod stanu odpowiedzi nie wskazuje na sukces: {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; }
źródło
To zadziałało dla mnie
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
źródło