¿Cómo puedo leer una secuencia de respuesta Http dos veces en C #?
Pregunta
Estoy intentando leer un flujo de respuesta Http dos veces a través de lo siguiente:
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 de StreamReader se ejecuta, no se devuelven datos porque la secuencia ya ha llegado al final. Intenté restablecer la transmisión 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 procesar (en formato de cadena).
¿Alguna idea?
Solución
Cópialo primero en un nuevo MemoryStream. Luego puede volver a leer el MemoryStream tantas veces como desee:
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;
}
Otros consejos
¿has intentado restablecer la posición del flujo? Si esto no funciona, puede copiar el flujo a un MemoryStream y allí puede restablecer la posición (es decir, a 0) con la frecuencia que desee.