Comment puis-je obtenir StatusCode à partir de HttpRequestException?
je suis probablement en train de rater quelque chose d'évident ici.
j'utilise HttpClient
qui lance HttpRequestException
qui contient StatusCode
dans la chaîne de messages.
Comment puis-je accéder à ce StatusCode
?
modifier : plus d'info, j'ai écrit cette question dans rush.
j'utilise HttpClient
pour accéder à une autre API dans mon projet WebApi. Oui, J' sachez pourquoi j'appelle EnsureSuccessStatusCode()
. Je veux propager quelques erreurs en aval comme 404 et 403.
Tout ce que je voulais, c'était transformer systématiquement HttpRequestException
en HttpResponseException
en utilisant la coutume ExceptionFilterAttribute
.
malheureusement, HttpRequestException
ne contient aucune information supplémentaire que je pourrais utiliser en plus du message. J'espérais découvrir StatusCode
sous forme brute (int ou enum).
on dirait que je peux soit:
- utilisez le message pour changer le code d'état (bleh)
- ou créer ma version de EnsureSuccessStatusCode et jeter l'exception qui est réellement utilisable.
4 réponses
a été passé en tant que partie d'une chaîne de caractères à HttpRequestException
de sorte que vous ne pouvez pas le récupérer de telles exceptions seulement.
le dessin de System.Net.Http
exige que vous accédiez à HttpResponseMessage.StatusCode
au lieu d'attendre l'exception.
http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage (v=V110).aspx
si vous suivez maintenant le guide de Microsoft , assurez-vous de bien comprendre pourquoi il vous demande d'appeler HttpResponseMessage.EnsureSucessStatusCode
. Si vous n'appelez pas cette fonction, il ne devrait pas y avoir d'exception.
pour ce que ça vaut, ce type a fait quelque chose d'intelligent: 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
dans le cas où j'avais besoin d'une propriété de statut d'exception, je peux le faire:
catch (HttpRequestException requestException)
{
if (requestException.InnerException is WebException &&
((WebException)requestException.InnerException).Status == WebExceptionStatus.NameResolutionFailure)
{
return true;
}
return false;
}
comme mentionné par d'autres aussi ce n'est pas une bonne pratique d'obtenir le StatusCode à partir de HttpRequestException, la même chose peut être faite à l'avance avec HttpResponseMessage.StatusCode après avoir vérifié le message HttpResponseMessage.Issuccesssstatuscode
de toute façon si en raison d'une contrainte / exigence on doit lire StatusCode, Il peut y avoir deux solutions
- a étendu le message de réponse avec votre exception personnalisée expliquée ici
- Hack sur la HttpRequestException.ToString pour obtenir le StatusCode, Que le message est une constante poste fixe par StatusCode et Repharse.
ci-dessous le code dans le système.Net.Http.Httprespondemessage Où SR.net_http_message_not_success_statuscode = " le code D'état de la réponse n'indique pas le succès: {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;
}
cela a fonctionné pour moi
var response = ex.Response;
var property = response.GetType().GetProperty("StatusCode");
if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)