2011-12-13 11 views
5

Estoy tratando de leer bytes de un ResponeStream, pero ¿cómo puedo decir que espere los datos?WebRequest GetResponseStream leer bytes

Si configuro un punto de interrupción después de GetResponseStream y espero unos segundos todo funciona bien. Usar StreamReader.ReadToEnd() también funciona bien, pero quiero leer los bytes yo mismo.

byte[] response = null; 

int left = 0; 
int steps = 0; 
int pos = 0; 

int bytelength = 1024; 

OnReceiveStart(); 

using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) { 
    using (Stream sr = webResponse.GetResponseStream()) { 

     response = new byte[(int)webResponse.ContentLength]; 

     left = (int)webResponse.ContentLength % bytelength; 
     steps = (int)webResponse.ContentLength/bytelength; 
     pos = 0; 

     for (int i = 0; i < steps; i++) { 
      sr.Read(response, pos, bytelength); 
      pos += bytelength; 
      OnReceiveProgress((int)webResponse.ContentLength, pos); 
     } 

     if (left != 0) { 
      sr.Read(response, pos, left); 
     } 

     sr.Close(); 
    } 
    webResponse.Close(); 
} 

OnReceiveProgress(1, 1); 

OnReceiveFinished(); 
+0

¿Cuál es el problema exacto que está teniendo? Por cierto, 'Read' devuelve la cantidad de bytes realmente leídos. Úselo en lugar de 'bytelength' como la cantidad de bytes leídos. –

Respuesta

6

Simplemente no romperla en su número igual de pasos - en su lugar, sólo sigue leyendo en un bucle hasta que haya terminado:

while (pos < response.Length) 
{ 
    int bytesRead = sr.Read(response, pos, response.Length - pos); 
    if (bytesRead == 0) 
    { 
     // End of data and we didn't finish reading. Oops. 
     throw new IOException("Premature end of data"); 
    } 
    pos += bytesRead; 
    OnReceiveProgress(response.Length, pos); 
} 

Tenga en cuenta que debe usar el regreso valor de Stream.Read - no puede asumir leerá todo lo que ha pedido.

Cuestiones relacionadas