C #: HttpClient, le serveur a commis une violation de protocole. Section = ResponseStatusLine

J’utilise la classe HttpClient pour communiquer avec un service Web dans mon application WPF.

Lorsque je fais des requêtes GET consécutives sur la même connexion, tout fonctionne correctement. Cependant, lorsque je fais des requêtes PUT / PATCH consécutives sur la même connexion, la première requête s’exécute avec précision et je reçois une réponse, mais la seconde requête n’inclut pas le corps de la requête et le message “Le serveur a validé un protocole violation. Section = ResponseStatusLine “.

Mes demandes se terminent correctement si je ferme manuellement la connexion après chaque demande en ajoutant Connection: close to header. Cette “solution” est un mauvais modèle et les performances ne seront pas adaptées de manière appropriée.

Vous trouverez ci-dessous une version débridée de la liste de mes sorties de stream TCP à partir des demandes envoyées:

Wireshark: Suivre la sortie du stream TCP

GET /domain/api/tenant/current/object?objectName=Lizbot HTTP/1.1 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 50 {"Data":[{"Id":123,"ObjectName":"Lizbot","Date":null}],"Errors":[]} PATCH /domain/api/tenant/current/object/123 HTTP/1.1 Accept: application/json Content-Type: application/json; charset=utf-8 Content-Length: 50 {"Id":123,"ObjectName":"Lizbot","Date":null} HTTP/1.1 204 No Content Content-Type: application/json; charset=utf-8 {"Data":null,"Errors":[]} PATCH /domain/api/tenant/current/object/123/otherObject HTTP/1.1 Accept: application/json Content-Type: application/json; charset=utf-8 HTTP/1.1 400 Bad Request Content-Type: text/html; charset=us-ascii Connection: close Content-Length: 311 

Notez que le second PATCH manque l’object avec lequel il est censé se patcher. Si je change l’ordre du PATCHing, son deuxième object manque toujours.

Cette erreur semble être commune à quelques solutions connues que j’ai essayées. Ils consistent en cette solution qui implique la définition de la propriété useUnsafeHeaderParsing sur TRUE et la définition de la propriété Keep-Alive sur FALSE dans le fichier Web.Config. J’ai également essayé la solution consistant à définir ces propriétés de la manière indiquée ci-dessous:

  ServicePointManager.DefaultConnectionLimit = 2; ServicePointManager.Expect100Continue = false; 

Aucune de ces solutions n’a fonctionné. Il convient de noter que lors de l’utilisation de l’outil proxy de débogage HTTP, Fiddler, pour capturer ces demandes, je ne reçois aucune erreur.

Donc, ce que je demande, c’est que si quelqu’un connaisse une bonne solution pour atténuer cette erreur et me permettre de faire plusieurs demandes dans une connexion sans perdre le corps d’une mise à jour. Si plus de détails sont nécessaires, je serai ravi de les fournir.

Le problème sous-jacent est que la réponse PATCH inclut un contenu dans le corps de la réponse. Assurez-vous que le serveur n’envoie pas de contenu lors de l’envoi d’un 204 sans contenu.

Après beaucoup de débogage et de lecture, j’ai réalisé que j’essayais de modifier le fichier Web.Config de l’application WPF au lieu du fichier app.config!

Donc, si vous déposez ce code dans le fichier app.config à la racine de la balise de configuration pour une application WPF, le problème est résolu.