2010-04-23 5 views
12

Sûrement, sûrement, sûrement, il y a un moyen de configurer l'objet .Net HttpWebRequest afin qu'il ne déclenche pas une exception lorsque HttpWebRequest.GetResponse() est appelé et tout 300 ou 400 codes d'état sont renvoyés?Comment faire pour arrêter .Net HttpWebRequest.GetResponse() déclencher une exception

Jon Skeet does not think so, donc je n'ose même pas demander, mais j'ai du mal à croire qu'il n'y a aucun moyen de contourner cela. Les codes de réponse 300 et 400 sont des réponses valables dans certaines circonstances. Pourquoi serions-nous toujours obligés d'encourir les frais généraux d'une exception?

Peut-être y a-t-il des paramètres de configuration obscurs qui ont échappé à Jon Skeet? Peut-être existe-t-il un type d'objet de requête complètement différent qui ne peut pas avoir ce comportement?

(et oui, je sais que vous pouvez juste attraper l'exception et obtenir la réponse de cela, mais je voudrais trouver un moyen de ne pas avoir à le faire).

Merci pour toute aide

Répondre

5

Selon la spécification lorsqu'un serveur envoie un code 400 d'état, cela signifie que:

La demande n'a pas pu être compris par le serveur en raison d'une syntaxe incorrecte. Le client NE DEVRAIT PAS répéter la demande sans modifications.

Il semble donc assez naturel d'avoir une exception dans ce cas. En ce qui concerne 300, c'est plus discutable.

De toute façon, si vous voulez un comportement non-standard, vous pouvez toujours recourir à un TcpClient mais cela semble vraiment une mesure extrême et désespérée.

Avez-vous effectué des tests de performance? Avez-vous confirmé que lever une exception dans ce cas exceptionnel est un goulot d'étranglement pour votre application? Cela ressemble à une micro-optimisation dans ce cas. Ne pouvez-vous pas rendre ce serveur web heureux en forgeant une demande valide et en obtenant 200 à la fin? Si non, vous ne pouvez pas passer à un serveur Web plus standard?

+0

Bonjour Darin Merci pour votre réponse. Vous faites de bons points. Je pense que les exceptions (en raison de leurs dépenses) devraient être facultatives, et je suis surpris qu'il n'y ait pas moyen de contourner cela. Vos solutions de rechange sont de bonnes idées. Je vais enquêter plus loin ... – James

+0

Je suis d'accord et surtout, les services Web renvoient généralement des codes d'état 400 et 500 pour signaler des entrées non valides aux appels de service. Dans de nombreux cas, ce ne sont pas des erreurs. Par exemple, nous obtenons 400 codes d'état renvoyés par un certain service Web, simplement pour indiquer qu'il n'y a pas d'enregistrement disponible - ce n'est pas une erreur cependant. Le corps de la réponse est toujours json avec un message pour nous. Donc, je suis d'accord qu'il serait idéal de désactiver les exceptions, c'est pourquoi moi et beaucoup d'autres trouvent ce poste. –

1

La définition de la propriété AllowAutoRedirect sur HttpWebRequest sur false empêchera le lancement d'une exception lorsqu'un serveur envoie un code d'état 300.

Cependant, cela n'empêche pas les codes d'état 404 de déclencher une exception.

9

Si vous souhaitez récupérer la réponse d'erreur 4xx erreurs que vous pouvez le faire comme ceci:

HttpWebResponse res = null; 
string response = string.Empty; 
StreamReader sr = null; 
Stream resst = null; 
try 
{ 
    res = (HttpWebResponse)req.GetResponse(); 
    resst = res.GetResponseStream(); 
    sr = new StreamReader(resst); 
    response = sr.ReadToEnd(); 
} 
catch (WebException exception) 
{ 
    HttpWebResponse errorResponse = (HttpWebResponse)exception.Response; 
    resst = errorResponse.GetResponseStream(); 
    sr = new StreamReader(resst); 
    response = sr.ReadToEnd(); 
} 
this.Response.Write(response); 

Hope this helps ...

+0

cette réponse http://stackoverflow.com/a/2676411/671619 dit le contraire. Qui a raison? – Firo

+1

Je viens de courir ce code après avoir obtenu un 400 et il retourne les détails de l'erreur attendue dans la réponse. – rob

+1

Attention, [WebException.Response peut être nul] (https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.Net.WebException.Response%29;k% 28TargetFrameworkMoniker-.NETFramework). –

Questions connexes