Lorsque j'essaie de POSTER vers une URL, il en résulte l'exception suivante:
Le serveur distant a renvoyé une erreur: (417) Échec de l'attente.
Voici un exemple de code:
var client = new WebClient();
var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");
byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.
Utiliser une HttpWebRequest/HttpWebResponse
paire ou un HttpClient
ne fait aucune différence.
Quelle est la cause de cette exception?
Expect
tête qui , par défaut est ajouté commeExpect100Continue
esttrue
par défaut.Réponses:
System.Net.HttpWebRequest ajoute l'en-tête 'En-tête HTTP "Expect: 100-Continue"' à chaque demande, sauf si vous lui demandez explicitement de ne pas le faire en définissant cette propriété statique sur false:
Certains serveurs s'étouffent avec cet en-tête et renvoient l'erreur 417 que vous voyez.
Essayez ça.
la source
Autrement -
Ajoutez ces lignes à la section de configuration de votre fichier de configuration d'application:
la source
Cette même situation et cette erreur peuvent également survenir avec un proxy de service Web SOAP généré par assistant (pas à 100% si c'est également le cas sur la
System.ServiceModel
pile WCF ) lors de l'exécution:Expect
tête dans le cadre d'un HTTPPOST
ou d'unePUT
demande en raison d'une convention de protocole standard d'envoi de la demande en deux parties, comme indiqué dans les remarques ici )... donnant un 417.
Comme indiqué dans les autres réponses, si le problème spécifique que vous rencontrez est que l'en-
Expect
tête est à l'origine du problème, ce problème spécifique peut être détourné en effectuant une désactivation relativement globale de la transmission PUT / POST en deux parties viaSystem.Net.ServicePointManager.Expect100Continue
.Cependant, cela ne résout pas le problème sous-jacent complet - la pile peut toujours utiliser des choses spécifiques à HTTP 1.1 telles que KeepAlives etc. (bien que dans de nombreux cas, les autres réponses couvrent les cas principaux.)
Le problème réel est cependant que le code généré automatiquement suppose qu'il est OK d'utiliser aveuglément les fonctionnalités HTTP 1.1 comme tout le monde le comprend. Pour arrêter cette hypothèse pour un proxy de service Web spécifique, on peut modifier la substitution du sous-jacent par défaut
HttpWebRequest.ProtocolVersion
à la valeur par défaut de 1.1 en créant une classe de proxy dérivée qui remplace comme indiqué dans cet article : -protected override WebRequest GetWebRequest(Uri uri)
(où
MyWS
est le proxy que l'assistant Ajouter une référence Web vous a craché.)MISE À JOUR: Voici un implément que j'utilise en production:
la source
Le formulaire que vous essayez d'émuler comporte-t-il deux champs, nom d'utilisateur et mot de passe?
Si oui, cette ligne:
n'est pas correcte.
vous auriez besoin de deux lignes comme:
Éditer:
D'accord, puisque ce n'est pas le problème, une façon de résoudre ce problème consiste à utiliser quelque chose comme Fiddler ou Wireshark pour regarder avec succès ce qui est envoyé au serveur Web à partir du navigateur, puis comparer cela à ce qui est envoyé à partir de votre code. Si vous allez sur un port 80 normal à partir de .Net, Fiddler capturera toujours ce trafic.
Il y a probablement un autre champ caché sur le formulaire que le serveur Web attend que vous n'envoyez pas.
la source
Solution du côté proxy, j'ai rencontré des problèmes dans le processus de négociation SSL et j'ai dû forcer mon serveur proxy à envoyer des demandes à l'aide de HTTP / 1.0 pour résoudre le problème en définissant cet argument dans le httpd.conf
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
après avoir rencontré l'erreur 417 comme mon application cliente utilisait HTTP / 1.1 et le proxy a été forcé d'utiliser HTTP / 1.0, le problème a été résolu en définissant ce paramètre dans httpd.conf du côté proxyRequestHeader unset Expect early
sans avoir besoin de changer quoi que ce soit du côté client, espérons que cela aide .la source
Pour Powershell, c'est
la source
Si vous utilisez " HttpClient " et que vous ne souhaitez pas utiliser la configuration globale pour affecter tout votre programme, vous pouvez utiliser:
Si vous utilisez " WebClient ", je pense que vous pouvez essayer de supprimer cet en-tête en appelant:
la source
Dans ma situation, cette erreur semble se produire uniquement si l'ordinateur de mon client a une politique de pare-feu stricte, ce qui empêche mon programme de communiquer avec le service Web.
La seule solution que j'ai pu trouver consiste donc à détecter l'erreur et à informer l'utilisateur de la modification manuelle des paramètres du pare-feu.
la source
L'approche web.config fonctionne pour les appels de services de formulaire InfoPath aux règles activées du service Web IntApp.
la source