40

次の方法で Http 応答ストリームを 2 回読み取ろうとしています。

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 のストリームを解析し、生データ (文字列形式) にアクセスしたいと考えています。

何か案は?

4

3 に答える 3

71

最初に新しい 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;
}
于 2008-09-29T08:36:32.523 に答える
-1

ストリームの位置をリセットしようとしましたか? これが機能しない場合は、ストリームを MemoryStream にコピーして、必要な回数だけ位置をリセット (つまり 0 に) できます。

于 2008-09-29T08:32:13.077 に答える