C #: HttpClient, der Server hat eine Protokollverletzung begangen. Abschnitt = ResponseStatusLine

9

Ich verwende die HttpClient Klasse, um mit einem zu kommunizieren Webdienst in meiner WPF-Anwendung.

Wenn ich aufeinanderfolgende GET-Anfragen für dieselbe Verbindung mache, funktioniert alles einwandfrei. Wenn ich jedoch aufeinanderfolgende PUT / PATCH-Anfragen für die gleiche 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 Verbindung: schließen zum Header hinzufüge. Diese "Lösung" ist ein schlechtes Muster und die Leistung wird nicht angemessen skaliert.

Im Folgenden finden Sie eine brandneue Version einer Liste meiner TCP-Stream-Ausgaben aus den gesendeten Anforderungen:

Wireshark: Folgen Sie der TCP-Stream-Ausgabe

%Vor%

Beachten Sie, dass dem zweiten PATCH das Objekt fehlt, 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, üblich zu sein. Sie bestehen aus dieser Lösung , bei der die useUnsafeHeaderParsing-Eigenschaft auf TRUE gesetzt und Keep-Alive festgelegt wird Eigenschaft auf FALSE in der Web.Config. Ich habe auch die Lösung versucht, diese Eigenschaften auf folgende Weise einzustellen:

%Vor%

Keine dieser Lösungen hat funktioniert. Es sollte beachtet werden, dass bei Verwendung des Http Debugging-Proxy-Tools Fiddler, um diese Anforderungen zu erfassen, keine Fehler angezeigt werden.

Was ich also möchte, ist, wenn jemand eine gute Lösung kennt, um diesen Fehler zu beheben, so dass ich mehrere Anfragen in einer Verbindung machen kann, ohne den Hauptteil eines Updates zu verlieren. Wenn mehr Details benötigt werden, bin ich glücklich, sie zu liefern.

    
Liz Miner 28.08.2013, 19:18
quelle

2 Antworten

6

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

    
Daniel 28.08.2013, 21:03
quelle
9
___ qstnhdr ___ C #: HttpClient, der Server hat eine Protokollverletzung begangen. Abschnitt = ResponseStatusLine ___ answer18498140 ___

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

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123wpf ___ Windows Presentation Foundation oder WPF ist ein Subsystem zum Rendern von Benutzeroberflächen in Windows-basierten Anwendungen. ___ answer18496452 ​​___

Nach langem Debuggen und Lesen wurde mir klar, dass ich versuchte, die Datei Web.Config der WPF-Anwendung anstelle der Datei app.config zu bearbeiten!

Wenn Sie also diesen Code in der Datei app.config im Stammverzeichnis des Konfigurations-Tags für eine WPF-Anwendung ablegen, wird das Problem behoben.

%Vor%     
___ qstntxt ___

Ich verwende die HttpClient Klasse, um mit einem zu kommunizieren Webdienst in meiner WPF-Anwendung.

Wenn ich aufeinanderfolgende GET-Anfragen für dieselbe Verbindung mache, funktioniert alles einwandfrei. Wenn ich jedoch aufeinanderfolgende PUT / PATCH-Anfragen für die gleiche 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 Verbindung: schließen zum Header hinzufüge. Diese "Lösung" ist ein schlechtes Muster und die Leistung wird nicht angemessen skaliert.

Im Folgenden finden Sie eine brandneue Version einer Liste meiner TCP-Stream-Ausgaben aus den gesendeten Anforderungen:

Wireshark: Folgen Sie der TCP-Stream-Ausgabe

%Vor%

Beachten Sie, dass dem zweiten PATCH das Objekt fehlt, 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, üblich zu sein. Sie bestehen aus dieser Lösung , bei der die useUnsafeHeaderParsing-Eigenschaft auf TRUE gesetzt und Keep-Alive festgelegt wird Eigenschaft auf FALSE in der Web.Config. Ich habe auch die Lösung versucht, diese Eigenschaften auf folgende Weise einzustellen:

%Vor%

Keine dieser Lösungen hat funktioniert. Es sollte beachtet werden, dass bei Verwendung des Http Debugging-Proxy-Tools Fiddler, um diese Anforderungen zu erfassen, keine Fehler angezeigt werden.

Was ich also möchte, ist, wenn jemand eine gute Lösung kennt, um diesen Fehler zu beheben, so dass ich mehrere Anfragen in einer Verbindung machen kann, ohne den Hauptteil eines Updates zu verlieren. Wenn mehr Details benötigt werden, bin ich glücklich, sie zu liefern.

    
___ tag123dotnethttpclient ___ Bezieht sich auf die System.Net.Http.HttpClient-Bibliothek, die Teil des HttpClient-Pakets in NuGet oder der .NET 4.5-Bibliothek ist. ___
Liz Miner 28.08.2013 19:18
quelle

Tags und Links