Laden...

Steuerzeichen bei Chunked Transfer Encoding nicht vorhanden

Erstellt von tmase vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.265 Views
T
tmase Themenstarter:in
11 Beiträge seit 2010
vor 5 Jahren
Steuerzeichen bei Chunked Transfer Encoding nicht vorhanden

Hallo liebe Leute,

ich habe den Auftrag als Client eine Persistent Connection zu einem Server aufzubauen. Der Server hält bei einem Request die Verbindung bis zu 8 Stunden offen und sendet vom User getriggerte Messages innerhalb eines Chunks zurück an den Client.
Wie Chunked Transfer Encoding funktioniert ist mir klar (Chunksize an erster Position des Chunks, dannach CRLF, dannach die Message, dannach wieder CRLF).

Um das ganze genauer zu veranschaulichen mein bisheriger Testcode.

string address = "https://xxxx-ds.i.xxxx.com/xxxx/services/Server?action=connect&id=xxxx&version=1.4";

            var request = (HttpWebRequest)WebRequest.Create(address);
            request.Method = "GET";
            request.KeepAlive = true;

            var response = (HttpWebResponse)request.GetResponse();
            var stream = response.GetResponseStream();

            var streamreader = new StreamReader(stream);
            byte[] buffer = new byte[4096];


            int r = stream.Read(buffer, 0, buffer.Length);
            using (var memorystream = new MemoryStream())
            {
                while (r > 0)
                {
                    memorystream.Write(buffer, 0, r);
                    r = stream.Read(buffer, 0, buffer.Length);
                }
                memorystream.Position = 0;
                var a = memorystream.ToArray();
                Console.Write(Encoding.ASCII.GetString(a));
            }

Mein Problem ist nun, dass der mir zugrunde liegende Response Stream anscheinend keine "Chunk-Steuerzeichen" (Chunksize, ...) liefert. Der Response Header Transfer-Encoding Chunked wird vom Server gesetzt, das Content-Lenght Attribut ist entsprechenderweise nicht vorhanden.
Mittels Wireshark wird beim Sniffen des Traffics jedoch ersichtlich, dass die Nachricht korrekt ankommt.

Wireshark:
2f
StarConnect DataServer - 1.11.0.3 - XXXXXXX XX

9
connected
60
Disonnecting this Connection, since you obviously requested a new Connection with GSSN GSXXXXXXX
0

Ausgelesen aus dem Stream:
StarConnect DataServer - 1.11.0.3 - XXXXXXX XX
connectedDisonnecting this Connection, since you obviously requested a new Connection with GSSN GSXXXXXXX

Ist es möglich, dass die .NET Klassen rund um WebRequest, HttpClient, ... die eigentlichen Rohdaten vorfiltern und wenn ja, wie kann ich auf diese Rohdaten zugreifen?

Vielen Dank im Voraus,
lg

16.806 Beiträge seit 2008
vor 5 Jahren

Ich hab mal Deine URL editiert; denn ich denke das eigentliche System muss keiner kennen.

Zum Problem: ich denke, es liegt daran, dass Du kein Content Type gesetzt hast; würde mal tippen es ist application/x-www-form-urlencoded

Spätestens der Systemverantwortliche müsste das wissen.

3.170 Beiträge seit 2006
vor 5 Jahren

Hallo,

der ResponseStream der HttpWebResponse gibt Dir - wie Du schon festgestellt hast - nur die Nutzdaten raus. Das Parsen der Chunks wird bereits intern gemacht.

Das ist normalerweise auch das, was man will - schließlich handelt es sich trotz der Chunks um eine zusammenhängende Response. Die ist eigentlich nicht dafür gedacht, in der Zusammensetzung der Chunks eine Semantik unterzubringen, sondern um bei aufwändiger Generierung einer Response bereits fertige Teile schon mal an den Client zu senden.

Das kannst Du Dir in den .NET-Quellen ansehen:
GetResponseStream erstellt intern einen ConnectStream, der im Konstruktor bereits den ChunkParser erstellt. Du wirst an die Chunk-Metadaten mit HttpWebResponse also nicht so einfach drankommen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca