Как я могу прочитать поток ответов Http дважды в C #? - PullRequest
34 голосов
/ 29 сентября 2008

Я пытаюсь прочитать поток ответов Http дважды с помощью следующего:

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

Однако при выполнении кода StreamReader данные не возвращаются, потому что поток достиг конца. Я попытался сбросить поток через stream.Position = 0, но это вызывает исключение (я думаю, потому что поток не может изменить свою позицию вручную).

По сути, я хотел бы проанализировать поток для XML и получить доступ к необработанным данным (в строковом формате).

Есть идеи?

Ответы [ 2 ]

68 голосов
/ 29 сентября 2008

Сначала скопируйте его в новый MemoryStream. Затем вы можете перечитывать MemoryStream столько раз, сколько захотите:

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;
}
0 голосов
/ 29 сентября 2008

вы пытались сбросить позицию потока? если это не работает, вы можете скопировать поток в MemoryStream и там вы можете сбросить позицию (то есть на 0) так часто, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...