2008-09-29 66 views
33

我想讀一個HTTP響應流兩次通過如下:如何在C#中兩次讀取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並有權訪問原始數據(字符串格式)。

任何想法?

回答

64

首先將其複製到新的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; 
} 
+4

一個很小的建議,在這裏 - 我經常看到來電尋求在位置屬性會更簡單,更具可讀性,例如 ms.Position = 0; 只是對未來代碼的思考。 – 2008-09-29 09:42:10

-1

你有沒有嘗試重置流的位置? 如果這不起作用,您可以將流複製到MemoryStream中,然後您可以根據需要重置位置(即爲0)。

+0

拋出不支持錯誤 – ppumkin 2017-09-18 10:02:12