Ich vermisse hier wahrscheinlich etwas Offensichtliches.
Ich verwende HttpClient
die Würfe HttpRequestException
, die StatusCode
in der Nachrichtenzeichenfolge enthalten sind.
Wie kann ich darauf zugreifen StatusCode
?
Edit : Mehr Infos, ich habe diese Frage in Eile geschrieben.
Ich verwende, HttpClient
um auf eine andere API in meinem WebApi-Projekt zuzugreifen. Ja, ich weiß warum ich anrufe EnsureSuccessStatusCode()
. Ich möchte einige Fehler nachgelagert verbreiten, wie z. B. 404 und 403.
Alles, was ich wollte, war, mich konsequent HttpRequestException
in die HttpResponseException
Verwendung von Gewohnheiten zu verwandeln ExceptionFilterAttribute
.
Enthält leider HttpRequestException
keine zusätzlichen Informationen, die ich neben der Nachricht verwenden könnte. Ich hatte gehofft, StatusCode
in roher (int oder enum) Form aufzudecken .
Sieht so aus, als könnte ich entweder:
- Verwenden Sie die Nachricht, um den Statuscode zu wechseln (bleh)
- Oder erstellen Sie meine Version von EnsureSuccessStatusCode und lösen Sie eine Ausnahme aus, die tatsächlich verwendet werden kann.
Antworten:
Der Statuscode wurde als Teil einer Zeichenfolge an übergeben,
HttpRequestException
damit Sie ihn nicht allein aus solchen Ausnahmen wiederherstellen können.Für das Design von
System.Net.Http
müssen Sie zugreifen,HttpResponseMessage.StatusCode
anstatt auf die Ausnahme zu warten.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Wenn Sie jetzt dem Microsoft-Handbuch folgen , stellen Sie sicher, dass Sie genau verstehen, warum Sie dazu aufgefordert werden, anzurufen
HttpResponseMessage.EnsureSucessStatusCode
. Wenn Sie diese Funktion nicht aufrufen, sollte es keine Ausnahme geben.quelle
Für was es wert ist, hat dieser Typ etwas Kluges getan: 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
In dem Fall, in dem ich eine Ausnahmestatus-Eigenschaft benötigte, kann ich Folgendes tun:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }
quelle
requestException.InnerException
ist null, daher funktioniert dies nichtWie auch von anderen erwähnt, ist es keine gute Praxis, den StatusCode von HttpRequestException abzurufen. Dies kann zuvor mit HttpResponseMessage.StatusCode durchgeführt werden, nachdem HttpResponseMessage.IsSuccessStatusCode überprüft wurde
Auf jeden Fall kann es zwei Lösungen geben, wenn aufgrund einer Einschränkung / Anforderung StatusCode gelesen werden muss
Unten finden Sie den Code in System.Net.Http.HttpResponseMessage, wobei SR.net_http_message_not_success_statuscode = "Der Antwortstatuscode zeigt keinen Erfolg an: {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; }
quelle
Das hat bei mir funktioniert
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
quelle