C#でHttp応答ストリームを2回読み取るにはどうすればよいですか?
質問
次の方法で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のストリームを解析し、生データ(文字列形式)にアクセスします。
アイデアはありますか
解決
最初に新しい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;
}
他のヒント
ストリームの位置をリセットしようとしましたか? これが機能しない場合は、ストリームをMemoryStreamにコピーして、必要に応じて何度でも位置をリセット(つまり0に)できます。
所属していません StackOverflow