Pergunta

Eu estou tentando ler um HTTP fluxo de resposta duas vezes via o seguinte:

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

No entanto, quando o código StreamReader executa não há dados retornado porque o fluxo já chegou ao fim. Tentei redefinir o fluxo via stream.Position = 0, mas isso gera uma exceção (eu acho porque o fluxo não pode ter sua posição alterada manualmente).

Basicamente, eu gostaria de analisar o fluxo de XML e ter acesso aos dados brutos (no formato de cadeia).

Todas as idéias?

Foi útil?

Solução

Copie-o para um novo MemoryStream em primeiro lugar. Então você pode voltar a ler o MemoryStream tantas vezes quanto você gosta:

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

Outras dicas

você já tentou redefinir a posição stream? se isso não funcionar, você pode copiar o fluxo em um MemoryStream e lá você pode redefinir a posição (ou seja a 0) quantas vezes você quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top