Wie zu Lesen, die response-stream, bevor die Http-Antwort abgeschlossen ist
Wenn Sie eine Anfrage über HttpWebRequest-Objekt, ich brauche Sie zum aufrufen der Methode GetResponse() auf, um die Anfrage zu senden und erhalten die Antwort zurück.
Das problem mit dieser Methode ist, dass es nicht das response-Objekt zurückzugeben, bis alle Daten empfangen wurden. Sagen, ich bin das herunterladen einer 100 MB-Datei, die ich nicht in der Lage sein, es zu Lesen, bis die Reaktion fertig und alle die 100 MB heruntergeladen werden.
Was ich will ist zu können die Antwort Lesen, Byte-stream, sobald Sie ankommen, ohne zu warten, für die Reaktion zu vervollständigen.
Ich weiß, ich kann die Http-header, aber es funktioniert nicht auf meine situation.
Nicht klar, ob die OP hat ja getestet, keine der vorgeschlagenen Lösungen und spezifischen Problemen konfrontiert. In meiner Erfahrung, eine Reaktion zu erhalten-stream bekommt nur den stream und wie Sie Lesen aus dem stream, die Antwort wird heruntergeladen, es sei denn natürlich es ist ein kleines Stück!
InformationsquelleAutor | 2010-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das ist sehr nahe an dem, was @Zachary schlägt. Und es (scheint) Arbeit(en); eigentlich denke ich, mit
using
@Zacharias tut, ist auch "schöner".Meine wichtigste Punkt, den ich nicht sehen kann die blockierende Verhalten von
GetResponse()
Sie (scheinen zu) beschreiben.Zusätzlich den folgenden code nur grob zeigt, wie alles funktioniert; wird es nicht Lesen, den stream an der Ende zum Beispiel (es sei denn, durch Zufall :)). Aber es sollte funktionieren, wenn Sie copy-n-paste in eine leere "Console Application"Projekt in Visual Studio.
Können Sie versuchen, mit etwas "kürzer" URL für einen test. Hier das Beispiel startet den Download einer ISO von debian-distribution (ein bisschen mehr als 600 MByte). Sorry debian, ich meine nicht, um zu stehlen Ihre Bandbreite. -> Btw: gibt es etwas vernünftiges kann man verwenden, um zu testen, wie ein Szenario?
Der Code ist stark inspiriert von C# - Wie liest man einen kontinuierlichen Strom von XML über HTTP.
InformationsquelleAutor scherand
Ich war auf der Suche für die gleiche Sache: server streamt chunked XML-Daten und ich brauchte einen C# - client, der den Zugriff auf diese Daten während der server-streaming. Ich habe versucht viele verschiedene Möglichkeiten, um den Zugriff auf die Quelle (WebChannelFactory, WebClient, HttpWebRequest/Response, TcpClient), aber nicht so weit. Suche nach diesem thread ich konzentrierte mich auf HttpWebRequest/Response-wo habe ich das gleiche problem, dass folgende Zeile blockieren von:
Als Artiom Chilaru erklärte, wenn es blockiert wird: etwas ist falsch, weil es nicht sein sollte. Der Schwerpunkt nun auf den Versuch zu replizieren default-Verhalten mit dem herunterladen große .ISO-Dateien, die ich fand heraus, dass Fiddler war die Blockierung der GetResponse () - Methode!
Jedoch ist es kein problem, offene Fiddler sobald der stream eingerichtet ist (D. H. GetResponse() bereits aufgerufen wurde), aber während der HTTP-GET, wenn Sie finden GetResponse() blockiert, versuchen Sie, zu schließen, Fiddler und sehen, wenn Sie Ihre Applikation jetzt kontinuierlich, es ist normal flow (d.h. das Lesen der stream).
Ich weiß, dies ist ein Alter thread, aber das hinzufügen meine 2 Cent. Fiddler ist eigentlich ein proxy-server, also es wird tatsächlich die gesamte Antwort vom ursprünglichen server und dann tut, was Sie erwarten, es zu tun. Das ist, warum Ihre Blockade.
InformationsquelleAutor Geoffrey VL
Wenn Sie die Größe des Puffers festzulegen, die auf Ihrem Lesen, Sie kann Lesen Sie die Daten in Blöcken Beispiel......
InformationsquelleAutor Zachary
Ich bin mir nicht sicher, was Sie auf Ihrer Seite, aber ich weiß, für eine Tatsache (und ich bin sicher, viele Leute werden Zustimmen, hier), dass
GetResponse()
wird NICHT laden Sie die gesamte Datei wieder. Es wird das senden der Anforderung, auf die Reaktion warten, und bekommen die Antwort-Header.Nachdem Sie die Antwort erhalten, können Sie leicht die Antwort, die stream mit
GetResponseStream()
, das ist die eigentliche Daten-stream, Download vom server. Und man kann leicht Zugriff auf das response-stream, BEVOR die gesamte Datei heruntergeladen wurde. Das ist 100% wahr und getestet.Wenn Sie nicht immer das gleiche Verhalten (das ist wirklich merkwürdig und sollte nicht passieren) könntest du ein code-Beispiel, das nicht so funktioniert, wie ich oben erklärt?
Auch machen, testen Sie die Beispiel-gepostet von scherand. Es beweist nur wieder einmal, dass es funktioniert Prima, ohne Besondere hacks.
InformationsquelleAutor Artiom Chilaru