C#에서 HTTP 응답 스트림을 두 번 읽으려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/147941

  •  02-07-2019
  •  | 
  •  

문제

다음을 통해 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 스트림을 구문 분석하고 원시 데이터 (문자열 형식)에 액세스하고 싶습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

먼저 새 메모리 스트림으로 복사하십시오. 그런 다음 원하는만큼 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)를 재설정 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top