Exception occurred: The server comitted a protocol violation Section=ResponseStatusLi


Jennesta

Erfahrenes Mitglied
Exception occured:The server comitted a protocol violation Section=ResponseStatusLine

Hi Leute,
nun bekomme ich zum ersten mal die Gelegenheit auch etwas unter C# zu schreiben, wünschte die Umstände wären allerdings etwas schöner :D
Leider habe ich wenig bis keine Ahnung von C#, erhoffe mir aber trotzdem hierbei etwas Hilfe.

Kurze Einleitung zu dem Fehler. Ich selbst schreibe ein Server Programm auf Linux, ganz banal mit send()/recv() realisiert. Mein Arbeits-Kollege, schreibt für Windows mit C#/.NET die Client Anwendung.

Nun schickt er mir eine HTTP-Anfrage, ich berechne etwas und möchte dann mit einer Datei antworten. Soweit so gut, jedesmal reagiert der Client mit oben genannter Exception.
Nun sagt er, es sei Fehler des Servers, wg. falschem HTTP-Header, jedoch antworte ich mit dem Header der mit vorgegeben wurde, wie folgt:

Code:
POST /TWVS/TVWSService/loadKML HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: www.example.com
Content-Length: 13466
Connection: Keep-Alive

XMLContent=<?xml version="1.0" encoding="UTF-8"?> […] 


HTTP/1.1 200 OK
Date: Tue, 08 Nov 2011 11:18:03 GMT
Server: TWVS Server
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1


<kml> […] </kml>
Nun, wie gesagt habe ich nicht viel Ahnung von der Materie, allerdings laut Google scheint es wohl am Header zu liegen.
Erstmal, wie kann ich mehr Informationen bzgl. des Fehlers (von .NET) bekommen?
Dann würde mich interessieren, wo der Fehler wirklich liegt. Client oder Server und vorallem warum und wie kann man ihn vermeiden.

Wir haben schon andere verschiedene Header ausprobiert, jedoch lieferte keiner irgendwelchen Erfolg.
Auch mit Google, kam ich bisher nur spärlich weiter. Gefunden habe ich z.b folgendes:

Code:
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
</configuration>
Ich habe ihm mal den Hinweis damit gegeben, allerdings hieß es das dies Server-seitiger Code wäre. :confused: Zumal er sagt, er würde nur Standart-Funktionen benutzen und Standart-Header erwarten. Leider scheint er zumindest in diesem Punkt auch nicht viel mehr Ahnung zu haben als ich. :(

Ich wäre echt dankbar ein paar Meinungen und vorallem Hilfen dazu zubekommen.

Grüße
Jennesta
 
Zuletzt bearbeitet:

rd4eva

Erfahrenes Mitglied
Ich hätte da 2 vorschläge.

1. Wenn der Server mit Transfer-Encoding: chunked antworted dann muss auch der content entsprechend "formatiert" sein.
Soll heissen in Blöcke unterteilt, wobei jeder Block mit der Anzahl an bytes ( in Hexa ) beginnt.
Danach folgt ein {CR}{LF}.
Dann die Daten die wiederum mit einem {CR}{LF} enden müssen.
z.B.
Code:
25
This is the data in the first chunk

1C
and this is the second one

"This is the data in the first chunk\r\n"      (37 chars => hex: 0x25)
"and this is the second one\r\n"               (28 chars => hex: 0x1C)
Beispiel von hier: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Einfacher wäre natürlich das Transfer-Encoding: chunked weg zu lassen und stattdessen eine Content-Length zu definieren.

2. Nachdem der Server unter Linux läuft:
Linux verwendet {LF} als Newline.
Wohingegen Windows {CR}{LF} verwendet und genau das erwartet c# auch.
Mit anderen Worten : überprüf mal ob die einzelnen Zeilen der Response mit einem {LF} oder einem {CR}{LF} enden.
 

Jennesta

Erfahrenes Mitglied
Hi rd4eva,
danke für die Ausführliche Hilfe. Das mit dem {CR}, welches ich nicht genutzt habe, hat in der Tat mein Problem mit dem Header gelöst.
Es wird momentan noch mind eine andere Exception geworfen, aber vielleicht ist das mit deinem Hinweis bzgl. der chunks zu lösen, dauert nur etwas, bis ich das auch testen kann.

Grüße
 

rd4eva

Erfahrenes Mitglied
Schön das es geholfen hat.

Noch als Nachtrag
<httpWebRequest useUnsafeHeaderParsing="true" />
...
Ich habe ihm mal den Hinweis damit gegeben, allerdings hieß es das dies Server-seitiger Code wäre.
Das ist natürlich quatsch.
Die Header müssen ja schließlich nicht nur vom Server geparst werden sondern auch vom client.

Wie bereits oben geschrieben erwartet der client halt folgendes Format:
Code:
Version statuscode statustext{CR}{LF}
Headerkey: Headervalue{CR}{LF}
...
{CR}{LF}
content
Und genau dieses Verhalten wird (u.a.) mit oben genanntem schippsel deaktiviert.
Siehe Doku: http://msdn.microsoft.com/en-us/library/system.net.configuration.httpwebrequestelement.useunsafeheaderparsing.aspx
When this property is set to false, the following validations are performed during HTTP parsing:

In end-of-line code, use CRLF; using CR or LF alone is not allowed.
...
 

Jennesta

Erfahrenes Mitglied
Hi,
nun habe ich auch ein bisschen mit Wireshark gespielt und alles aus dem Header geworfen, was erstmal unwichtig scheint. Nun funktioniert es auch. Vielleicht werde ich wieder langsam Header-Zeilen einfügen, jedoch sagt man ja auch oft so schön "Never change a running system" :D

Aber dir vielen Dank für die ausführliche Hilfe.

Ach aber eine Frage hätte ich noch. Kann man irgendwo seinen Header verifizieren lassen? Ich habe mir zwar auch mal diese Seite angesehen, allerdings ist das schon krass viel Information. Und auch wenn ich weiß, wie es vorgesehen ist, kann ich manchmal schlecht herauslesen, ob ich es richtig umgesetzt habe.

Grüße Jennesta
 

Neue Beiträge