Domanda

Sto cercando di leggere due volte un flusso di risposta Http tramite:

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();

Tuttavia, quando viene eseguito il codice StreamReader, non vengono restituiti dati perché il flusso ha raggiunto la fine. Ho provato a reimpostare lo stream tramite stream.Position = 0 ma questo genera un'eccezione (penso perché lo stream non può cambiare manualmente la sua posizione).

Fondamentalmente, vorrei analizzare il flusso per XML e avere accesso ai dati grezzi (in formato stringa).

Qualche idea?

È stato utile?

Soluzione

Copiarlo prima in un nuovo MemoryStream. Quindi puoi rileggere MemoryStream tutte le volte che vuoi:

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

Altri suggerimenti

hai provato a ripristinare la posizione dello stream? se questo non funziona puoi copiare lo stream su MemoryStream e lì puoi reimpostare la posizione (cioè a 0) tutte le volte che vuoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top