2009-04-27 3 views
6

HttpListener gibt Ihnen Antwort-Stream, aber Aufruf von Flush bedeutet nichts (und aus Quellen ist klar, weil es eigentlich nichts tut). Wenn Sie innerhalb der HTTP-API suchen, ist dies eine Einschränkung von HttpListener.Wie HttpListener Antwort-Stream zu leeren?

Wer weiß genau, wie Antwort-Stream von HttpListener zu leeren (kann mit Reflexion oder zusätzliche P/Invokes) sein?

Update: Sie können nichts HTTP-Stream, wenn Sie keine Option zum Löschen oder die Möglichkeit haben, Puffergröße zu definieren.

Antwort

2

Flush funktioniert nur in den meisten System.Net-Namespaces, wenn Transfer-Encoding auf Chunched gesetzt ist, sonst wird die gesamte Anfrage zurückgegeben und Flush tut wirklich nichts. Zumindest habe ich das bei der Arbeit mit HttpWebResponse erfahren.

+0

Frage ist nicht, warum es nicht funktioniert ... Aber stellen Sie sich http Streaming vor, wo es wichtig ist, etwas so schnell wie möglich zu senden. Chunked-Daten sind hier keine Option. HttpListener sendet tatsächlich etwas, BEVOR Sie die Anfrage beendet haben, verwendet aber einen ziemlich großen nicht konfigurierbaren Puffer. – Mash

+0

Und übrigens, ASP.NET flushes ok, wenn Sie es fragen ... ASP.NET benötigt einige Hacks, um InputStream Inhalt zu erhalten, bevor vollständige POST Körper abgerufen wurde, aber OutputStream funktioniert ok. – Mash

+1

HTTP ist nicht wirklich ein Streaming-Protokoll. Es soll Text über das Internet übertragen, also den Namen Hyper-Text-Übertragungsprotokoll. Wenn Sie streamen möchten, würde ich eine Steckdose vorschlagen. Oder etwas besser, wenn Sie Inhalte in kleinen Paketen streamen, die Sie kontrollieren können. –

0

Ich habe das noch nicht versucht, aber wie wäre es mit einem separaten TCP-Server für Streaming-Antworten schreiben? Dann leiten Sie die Anfrage vom HttpListener an den "internen" TCP-Server weiter. Mit dieser Umleitung können Sie möglicherweise Daten nach Bedarf zurücksenden.

Wie zum Spülen es, nur sehe ich es zu tun ist, eine Entsorgung zu simulieren, ohne tatsächlich zu entsorgen. Wenn Sie in das HttpResponseStream-Objekt eindringen, es anweisen können, das M_Closed-Flag zu löschen, usw., können Sie die Streaming-Daten möglicherweise löschen.

+0

Schreiben separater TCP-Server? Es ist besser, einfach alles mit TcpListener zu schreiben (was schneller ist als .NET Sockets), aber es ist viel langsamer als HttpListener. Ich werde Quellen der Entsorgung überprüfen, aber imho, das ist nicht der richtige Weg. Gibt an, ob in http.sys, die mit dem Datenpaket selbst definiert sind, eine Leerung erfolgt oder nicht. – Mash

Verwandte Themen