当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中读取两次Http响应流?

如何解决《如何在C#中读取两次Http响应流?》经验,为你挑选了1个好方法。

我试图通过以下两次读取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的流并且可以访问原始数据(以字符串格式).

有任何想法吗?



1> Iain..:

首先将其复制到新的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;
}


另一条评论 - 上述内容并未最终关闭传入的流.可能值得创建一个"CopyAndClose"方法**关闭流,只是为了保持简单的调用语法.
.net 4及更高版本有更短的复制流的方式:[CopyTo](http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances)
这里有一个小小的建议 - 我经常看到调用Seek,其中Position属性更简单,更易读,例如ms.Position = 0; 只是想到未来的代码.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有