2013-08-28 21 views
8

Ich verwende die Klasse HttpClient, um mit einem Webdienst in meiner WPF-Anwendung zu kommunizieren.C#: HttpClient, der Server hat eine Protokollverletzung begangen. Abschnitt = ResponseStatusLine

Wenn ich aufeinanderfolgende GET-Anfragen auf der gleichen Verbindung mache, funktioniert alles gut. Wenn ich jedoch aufeinanderfolgende PUT/PATCH-Anfragen auf der gleichen Verbindung mache, wird die erste Anfrage genau ausgeführt und ich erhalte eine Antwort, aber die zweite Anfrage enthält nicht den Körper in der Anfrage und ich erhalte den berüchtigten Fehler "Der Server hat ein Protokoll begangen Verletzung. Abschnitt = ResponseStatusLine ".

Meine Anforderungen werden erfolgreich abgeschlossen, wenn ich die Verbindung nach jeder Anforderung manuell schließe, indem ich hinzufüge. Verbindung: Schließen Sie an die Kopfzeile. Diese "Lösung" ist ein schlechtes Muster und die Leistung wird nicht angemessen skaliert.

Nachfolgend finden Sie eine debranded Version einer Liste meiner TCP-Stream Output von den Anforderungen gesendet werden:

Wireshark: Folgen Sie TCP-Stream Output

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</b> 
    Content-Type: text/html; charset=us-ascii 
    Connection: close 
    Content-Length: 311 

Hinweis, dass der zweite PATCH das fehlt Objekt, mit dem es patchen soll. Wenn ich die Reihenfolge des PATCHs ändere, fehlt dem zweiten PATCH immer noch das Objekt.

Dieser Fehler scheint bei einigen bekannten Lösungen, die ich ausprobiert habe, zu sein. Sie bestehen aus this solution, was das Festlegen der useUnsafeHeaderParsing-Eigenschaft auf TRUE und das Festlegen der Keep-Alive-Eigenschaft auf FALSE in der Web.Config beinhaltet. Ich habe auch die Lösung versucht, diese Eigenschaften auf diese Weise wie unten gezeigt einzustellen:

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

Keine dieser Lösungen funktionierte. Es sollte beachtet werden, dass bei der Verwendung des Http Debugging Proxy-Tools, Fiddler, diese Anfragen nicht erfasst werden.

Also was ich frage ist, wenn jemand eine gute Lösung kennt, um diesen Fehler zu lindern, so kann ich mehrere Anfragen in einer Verbindung machen, ohne den Körper eines Updates zu verlieren. Wenn mehr Details benötigt werden, bin ich glücklich, sie zu liefern.

Antwort

6

Das zugrunde liegende Problem besteht darin, dass die PATCH-Antwort Inhalt innerhalb des Hauptteils der Antwort enthält. Stellen Sie sicher, dass der Server beim Senden eines No Contents keinen Inhalt sendet.

+0

Vielen Dank! Ich akzeptiere diese Antwort, denn meine wird zwar verhindern, dass der Fehler ausgelöst wird, aber das stellt sicher, dass ich keine Fehler zu werfen habe. –

+1

Obwohl ich stimme zu, dass das Senden von 204 mit einem Körper eine Protokollverletzung ist, kann HttpClient mit dieser Situation ohne jedes Problem umgehen. Wie kann selbst gehostete Web-API. Vielleicht vermasselt IIS Dinge. –

9

Nach viel Debuggen und Lesen, habe ich festgestellt, dass ich versucht habe, die Web.Config-Datei der WPF-Anwendung anstelle der app.config-Datei zu bearbeiten!

Wenn Sie also diesen Code in der Datei app.config im Stammverzeichnis des Konfigurationstags für eine WPF-Anwendung löschen, wird das Problem behoben.

<system.net> 
<settings> 
<httpWebRequest useUnsafeHeaderParsing = "true"/> 
</settings> 
</system.net>