2009-12-08 4 views
5

Sfondo - Sto tentando di eseguire lo streaming di una pagina Web esistente in un'applicazione Web separata, utilizzando HttpWebRequest/HttpWebResponse in C#. Un problema che mi colpisce è che sto cercando di impostare la lunghezza del contenuto della richiesta di upload del file utilizzando la lunghezza del contenuto del download del file, TUTTAVIA il problema sembra essere quando la pagina Web di origine si trova su un server web per il quale HttpWebResponse non fornire una lunghezza del contenuto.Chiunque ha codice di esempio per fare un download di streaming HTTP "chunked" di un web direttamente a un upload su un server web separato?

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; // #### 

DOMANDA: Come potrei aggiornare questo approccio per far fronte a questo caso (quando la risposta download non si dispone di un set di content-length). Sarebbe in qualche modo utilizzare un MemoryStream forse? Qualsiasi codice di esempio sarebbe apprezzato. In particolare, è disponibile un esempio di codice che qualcuno dovrebbe mostrare come eseguire un download HTTP "chunked" & per evitare problemi con il server Web di origine che non fornisce la lunghezza del contenuto?

Grazie

risposta

5

Come ho già applicato nei forum di Microsoft, ci sono un paio di opzioni che si hanno.

Tuttavia, questo è come lo farei con un MemoryStream:

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.... 
} 

Si noti inoltre che davvero non hanno bisogno di preoccuparsi di conoscere il valore per ContentLength a priori. Come hai intuito, potresti impostare SendChunked su true su uploadRequest e quindi copiarlo dal flusso di download nel flusso di caricamento. Oppure, è sufficiente eseguire la copia senza impostare chunked e HttpWebRequest (per quanto ne so) memorizzerà i dati internamente (assicurarsi che AllowWriteStreamBuffering sia impostato su true su uploadrequest) e calcolare la lunghezza del contenuto e inviare la richiesta.

+0

eccellente - devo solo uscire, ma ci tornerò una volta tornato ... – Greg