2009-12-08 2 views
5

Hintergrund - Ich versuche, eine vorhandene Webseite in eine separate Webanwendung zu streamen, mit HttpWebRequest/HttpWebResponse in C#. Ein Problem, auf das ich stoße, ist, dass ich versuche, die Inhalts-Länge der Datei-Upload-Anfrage mit der Inhalts-Länge des Datei-Downloads zu setzen. JEDOCH scheint das Problem zu sein, wenn die Quell-Webseite auf einem Webserver ist, für die die HttpWebResponse nicht Geben Sie eine Inhaltslänge an.Jeder hat Beispielcode für einen "chunked" HTTP-Streaming-Download von einem Web direkt zu einem Upload auf einen separaten Webserver?

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest; 
using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse) 
{ 
    var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath")); 
    uploadRequest.Method = "POST"; 
    uploadRequest.ContentLength = downloadResponse.ContentLength; // #### 

FRAG: Wie kann ich diesen Ansatz aktualisieren könnte für diesen Fall gerecht zu werden (wenn die Download-Antwort keinen Content-Length-Satz hat). Würde es vielleicht einen MemoryStream benutzen? Jeder Beispielcode würde geschätzt werden. Insbesondere gibt es ein Codebeispiel, das jemand zeigen würde, wie man einen "chunked" HTTP-Download macht & heraufladen, um irgendwelche Probleme des Quellwebservers zu vermeiden, die Inhaltlänge nicht zur Verfügung stellen?

Dank

Antwort

5

Wie ich bereits in den Foren Microsoft angewendet wird, gibt es ein paar Optionen, die Sie haben.

Dies ist jedoch, wie ich es mit einem MemoryStream tun würde:

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest; 

byte [] buffer = new byte[4096]; 
using (MemoryStream ms = new MemoryStream()) 
using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse) 
{ 
    Stream respStream = downloadResponse.GetResponseStream(); 
    int read = respStream.Read(buffer, 0, buffer.Length); 

    while(read > 0) 
    { 
     ms.Write(buffer, 0, read); 
     read = respStream.Read(buffer, 0, buffer.Length); 
    } 

    // get the data of the stream 
    byte [] uploadData = ms.ToArray(); 

    var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath")); 
    uploadRequest.Method = "POST"; 
    uploadRequest.ContentLength = uploadData.Length; 

    // you know what to do after this.... 
} 

Beachten Sie auch, dass Sie wirklich brauchen keine Sorgen über den Wert für ContentLength a priori zu wissen. Wie Sie schon vermutet haben, könnten Sie SendChunked auf true auf uploadRequest setzen und dann einfach vom Download-Stream in den Upload-Stream kopieren. Oder, Sie können einfach die Kopie ohne Einstellung chunked, und HttpWebRequest (so weit ich weiß) die Daten intern puffern (stellen Sie sicher, AllowWriteStreamBuffering ist auf true auf uploadrequest gesetzt) ​​und herauszufinden, die Länge des Inhalts und senden Sie die Anfrage.

+0

ausgezeichnet - muss mich nur ducken, aber ich werde durchmachen, sobald ich zurück bin ... – Greg

Verwandte Themen