2008-09-29 22 views
33

Estoy intentando leer un flujo de respuesta HTTP dos veces a través de los siguientes:¿Cómo puedo leer una secuencia de respuesta Http dos veces en C#?

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
stream = response.GetResponseStream(); 
RssReader reader = new RssReader(stream); 
do 
{ 
    element = reader.Read(); 
    if (element is RssChannel) 
    { 
    feed.Channels.Add((RssChannel)element); 
    } 
} while (element != null); 

StreamReader sr = new StreamReader(stream); 
feed._FeedRawData = sr.ReadToEnd(); 

Sin embargo, cuando el código StreamReader ejecuta no hay datos devueltos porque la corriente ha llegado al final. Traté de restablecer el flujo a través de stream.Position = 0 pero esto arroja una excepción (creo que porque la transmisión no puede cambiar su posición manualmente).

Básicamente, me gustaría analizar la secuencia para XML y tener acceso a los datos sin formato (en formato de cadena).

¿Alguna idea?

Respuesta

64

Primero, copie en un nuevo MemoryStream. A continuación, puede volver a leer el MemoryStream tantas veces como se quiera:

Stream responseStream = CopyAndClose(resp.GetResponseStream()); 
// Do something with the stream 
responseStream.Position = 0; 
// Do something with the stream again 


private static Stream CopyAndClose(Stream inputStream) 
{ 
    const int readSize = 256; 
    byte[] buffer = new byte[readSize]; 
    MemoryStream ms = new MemoryStream(); 

    int count = inputStream.Read(buffer, 0, readSize); 
    while (count > 0) 
    { 
     ms.Write(buffer, 0, count); 
     count = inputStream.Read(buffer, 0, readSize); 
    } 
    ms.Position = 0; 
    inputStream.Close(); 
    return ms; 
} 
+4

Una pequeña sugerencia aquí - Veo a menudo llama a buscar en la propiedad Posición sería más simple y más fácil de leer, por ejemplo, ms.Position = 0; Solo una idea para el código futuro. –

+8

Otro comentario: lo anterior no termina cerrando la transmisión entrante, nunca. Podría valer la pena crear un método "CopyAndClose" que * cierre * la secuencia, solo para que pueda mantener la sintaxis de llamada simple. –

+0

Guau, acercándose a mis héroes .. Actualmente estoy leyendo su libro, Sr. Skeet :-) Lo que sugirió sobre el cierre (y diciendo con el nombre del método) es exactamente lo que pensé sobre el código anterior. – VVS

-1

¿Ha intentado restablecer la posición del flujo? si esto no funciona, puede copiar la secuencia en un MemoryStream y allí puede restablecer la posición (es decir, a 0) tantas veces como desee.

+0

Lanza error no soportado – ppumkin

Cuestiones relacionadas