2009-12-08 7 views
5

Antecedentes - Estoy intentando transmitir una página web existente a una aplicación web por separado, utilizando HttpWebRequest/HttpWebResponse en C#. Un problema que me llama la atención es que intento establecer la longitud de contenido de la solicitud de carga del archivo utilizando la longitud del contenido de la descarga del archivo, SIN EMBARGO, el problema parece ser cuando la página web de origen está en un servidor web para el cual HttpWebResponse no lo hace proporcionar una longitud de contenido¿Alguien tiene un código de muestra para realizar una descarga HTTP "fragmentada" de una web directamente a una carga en un servidor web diferente?

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

PREGUNTA: ¿Cómo podría actualizar este enfoque para hacer frente a este caso (cuando la respuesta descarga no se tiene un conjunto de longitud de contenido). ¿Sería de alguna manera utilizar un MemoryStream tal vez? Cualquier código de muestra sería apreciado. En particular, ¿hay alguna muestra de código que alguien tenga que muestre cómo hacer una descarga HTTP "fragmentada" & de carga para evitar problemas con el servidor web de origen que no proporciona contenido de longitud?

Gracias

Respuesta

5

Como ya aplicado en los foros de Microsoft, hay un par de opciones que tiene.

Sin embargo, esta es la forma en que lo haría 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.... 
} 

Además, tenga en cuenta que usted realmente no tiene que preocuparse acerca de conocer el valor de ContentLength a priori. Como ya habrás adivinado, podrías haber establecido SendChunked en true en uploadRequest, y luego simplemente copiar desde la secuencia de descarga a la transmisión de carga. O bien, puede hacer la copia sin configurar chunked, y HttpWebRequest (hasta donde yo sé) almacenará los datos en el búfer internamente (asegúrese de que AllowWriteStreamBuffering esté establecido en true en uploadrequest) y calcule la longitud del contenido y envíe la solicitud.

+0

excelente - Acabo de escabullirme, pero volveré cuando regrese ... – Greg

Cuestiones relacionadas