Je suis dans une situation où lorsque j'obtiens un code HTTP 400 du serveur, c'est un moyen complètement légal du serveur de me dire ce qui n'allait pas avec ma demande (en utilisant un message dans le contenu de la réponse HTTP)
Toutefois, le .NET HttpWebRequest déclenche une exception lorsque le code d'état est 400.
Comment dois-je gérer cela? Pour moi, un 400 est tout à fait légal et plutôt utile. Le contenu HTTP contient des informations importantes mais l'exception me jette hors de mon chemin.
.net
httpwebrequest
chefsmart
la source
la source
Réponses:
Ce serait bien s'il y avait un moyen de désactiver "jeter sur le code de non-réussite" mais si vous attrapez WebException, vous pouvez au moins utiliser la réponse:
Vous voudrez peut-être encapsuler le bit "obtenez-moi une réponse même si ce n'est pas un code de réussite" dans une méthode distincte. (Je vous suggère de toujours lancer s'il n'y a pas de réponse, par exemple si vous ne parvenez pas à vous connecter.)
Si la réponse d'erreur peut être importante (ce qui est inhabituel), vous pouvez modifier
HttpWebRequest.DefaultMaximumErrorResponseLength
pour vous assurer d'obtenir l'erreur complète.la source
Je sais que cela a déjà été répondu il y a longtemps, mais j'ai fait une méthode d'extension pour, espérons-le, aider d'autres personnes qui viennent à cette question.
Code:
Usage:
la source
WebException.Response
peut et peut êtrenull
. Vous devriez recommencer si c'est le cas.HttpClient
place, c'est beaucoup plus configurable, et je crois que c'est la voie de l'avenir.((WebRequest) null).GetResponseWithoutException()
ne provoquera en fait pas aNullReferenceException
, car il est compilé à l'équivalent deWebRequestExtensions.GetResponseWithoutException(null)
, ce qui n'entraînerait pas de aNullReferenceException
, d'où la nécessité d'une validation d'entrée.Fait intéressant, le
HttpWebResponse.GetResponseStream()
que vous obtenez duWebException.Response
n'est pas le même que le flux de réponse que vous auriez reçu du serveur. Dans notre environnement, nous perdons les réponses réelles du serveur lorsqu'un code d' état 400 HTTP est renvoyé au client à l'aide desHttpWebRequest/HttpWebResponse
objets. D'après ce que nous avons vu, le flux de réponse associé auWebException's HttpWebResponse
est généré sur le client et n'inclut aucun des corps de réponse du serveur. Très frustrant, car nous voulons signaler au client la raison de la mauvaise demande.la source
J'ai rencontré des problèmes similaires en essayant de me connecter au service OAuth2 de Google.
J'ai fini par écrire le POST manuellement, sans utiliser WebRequest, comme ceci:
La réponse qui est écrite dans le flux de réponse contient le texte d'erreur spécifique que vous recherchez.
En particulier, mon problème était que je mettais des lignes de fond entre des données encodées en URL. Quand je les ai sortis, tout a fonctionné. Vous pourrez peut-être utiliser une technique similaire pour vous connecter à votre service et lire le texte de l'erreur de réponse réelle.
la source
Essayez ceci (c'est VB-Code :-):
la source
Une version asynchrone de la fonction d'extension:
la source
Cela m'a résolu:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Problème: l'
hôte local renvoie le contenu attendu, l'IP distant modifie le contenu 400 en "Bad Request"
Solution:
L'ajout
<httpErrors existingResponse="PassThrough"></httpErrors>
àweb.config/configuration/system.webServer
résolu cela pour moi; maintenant, tous les serveurs (locaux et distants) renvoient exactement le même contenu (généré par moi) indépendamment de l'adresse IP et / ou du code HTTP que je renvoie.la source