简体   繁体   English

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

[英]How can I read an Http response stream twice in C#?

I am trying to read an Http response stream twice via the following:我试图通过以下方式读取 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();

However when the StreamReader code executes there is no data returned because the stream has now reached the end.但是,当 StreamReader 代码执行时,没有数据返回,因为流现在已经到达末尾。 I tried to reset the stream via stream.Position = 0 but this throws an exception (I think because the stream can't have its position changed manually).我试图通过 stream.Position = 0 重置流,但这会引发异常(我认为是因为流无法手动更改其位置)。

Basically, I would like to parse the stream for XML and have access to the raw data (in string format).基本上,我想解析 XML 流并访问原始数据(字符串格式)。

Any ideas?有任何想法吗?

Copy it into a new MemoryStream first.首先将其复制到新的 MemoryStream 中。 Then you can re-read the MemoryStream as many times as you like:然后,您可以根据需要多次重新读取 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;
}

Copying the stream to a MemoryStream as suggested by Iain is the right approach.按照Iain 的建议将流复制到MemoryStream是正确的方法。 But since .NET Framework 4 (released 2010) we have Stream.CopyTo .但是从 .NET Framework 4(2010 年发布)开始,我们有了Stream.CopyTo Example from the docs:文档中的示例:

// Create the streams.
MemoryStream destination = new MemoryStream();

using (FileStream source = File.Open(@"c:\temp\data.dat",
    FileMode.Open))
{

    Console.WriteLine("Source length: {0}", source.Length.ToString());

    // Copy source to destination.
    source.CopyTo(destination);
}

Console.WriteLine("Destination length: {0}", destination.Length.ToString());

Afterwards you can read destination as many times as you like:之后,您可以根据需要多次阅读destination

// re-set to beginning and convert stream to string
destination.Position = 0;
StreamReader streamReader = new StreamReader(destination);
string text = streamReader.ReadToEnd();
// re-set to beginning and read again
destination.Position = 0;
RssReader cssReader = new RssReader(destination);

(I have seen Endy's comment but since it is an appropriate, current answer, it should have its own answer entry.) (我已经看到Endy 的评论,但由于它是一个合适的当前答案,它应该有自己的答案条目。)

have you tried resetting the stream position?您是否尝试过重置流位置? if this does not work you can copy the stream to a MemoryStream and there you can reset the position (ie to 0) as often as you want.如果这不起作用,您可以将流复制到 MemoryStream,然后您可以根据需要随时重置位置(即重置为 0)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM