Il me manque probablement quelque chose d'évident ici.
J'utilise les HttpClient
lancers HttpRequestException
qui contiennent StatusCode
dans la chaîne Message.
Comment puis-je y accéder StatusCode
?
Edit : Plus d'infos, j'ai écrit cette question dans la précipitation.
J'utilise HttpClient
pour accéder à une autre API dans mon projet WebApi. Oui, je sais pourquoi j'appelle EnsureSuccessStatusCode()
. Je veux propager certaines erreurs en aval telles que 404 et 403.
Tout ce que je voulais, c'était de toujours me transformer HttpRequestException
en HttpResponseException
utilisation personnalisée 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:
- Utilisez le message pour changer le code d'état (bleh)
- Ou créez ma version d'EnsureSuccessStatusCode et lancez une exception qui est réellement utilisable.
Réponses:
Le code d'état a été transmis dans le cadre d'une chaîne à
HttpRequestException
afin que vous ne puissiez pas le récupérer uniquement à partir de telles exceptions.La conception de
System.Net.Http
vous oblige à accéderHttpResponseMessage.StatusCode
au lieu d'attendre l'exception.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Si vous suivez maintenant le guide Microsoft , assurez-vous de bien comprendre pourquoi il vous demande d'appeler
HttpResponseMessage.EnsureSucessStatusCode
. Si vous n'appelez pas cette fonction, il ne devrait y avoir aucune exception.la source
Pour ce que ça vaut, ce gars 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-le-nom-distant? forum = csharpgeneral
Dans le cas où j'ai besoin d'une propriété de statut d'exception, je peux le faire:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }
la source
requestException.InnerException
est nul, donc cela ne fonctionnera pasComme mentionné par d'autres également, ce n'est pas une bonne pratique d'obtenir le StatusCode de HttpRequestException, la même chose peut être faite au préalable avec HttpResponseMessage.StatusCode après avoir vérifié HttpResponseMessage.IsSuccessStatusCode
Quoi qu'il en soit, si en raison d'une contrainte / exigence, on doit lire StatusCode, il peut y avoir deux solutions
Voici le code dans System.Net.Http.HttpResponseMessage Where 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; }
la source
Cela a fonctionné pour moi
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
la source