2008-09-29 6 views
33

मैं निम्नलिखित के माध्यम से एक 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 कोड निष्पादित करता है कोई डेटा नहीं दिया क्योंकि धारा अंत अब तक पहुँच गया है। मैंने स्ट्रीम के माध्यम से स्ट्रीम को रीसेट करने का प्रयास किया। स्थिति = 0 लेकिन यह एक अपवाद फेंकता है (मुझे लगता है क्योंकि धारा में इसकी स्थिति मैन्युअल रूप से परिवर्तित नहीं हो सकती है)।

असल में, मैं एक्सएमएल के लिए स्ट्रीम को पार्स करना चाहता हूं और कच्चे डेटा (स्ट्रिंग प्रारूप में) तक पहुंच प्राप्त करना चाहता हूं।

कोई विचार?

उत्तर

64

इसे पहले एक नए मेमोरीस्ट्रीम में कॉपी करें। तो फिर तुम कई बार के रूप 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; भविष्य के कोड के लिए बस एक विचार। –

+8

एक और टिप्पणी - उपरोक्त आने वाली धारा को बंद करने का अंत नहीं होता है। यह "CopyAndClose" विधि बनाने के लायक हो सकता है जो * स्ट्रीम बंद करता है, बस इतना आसान है कि आप सरल कॉलिंग सिंटैक्स रख सकें। –

+0

वाह, मेरे नायकों के करीब आ रहा है .. मैं वर्तमान में आपकी पुस्तक पढ़ रहा हूं, श्री स्कीट :-) आपने बंद करने (विधि विधि के साथ कहने) के बारे में क्या सुझाव दिया है, मैंने उपर्युक्त कोड के बारे में सोचा है। – VVS

-1

क्या आपने स्ट्रीम स्थिति को रीसेट करने का प्रयास किया है? यदि यह काम नहीं करता है तो आप स्ट्रीम को मेमोरीस्ट्रीम पर कॉपी कर सकते हैं और वहां आप जितनी बार चाहें स्थिति (यानी 0) को रीसेट कर सकते हैं।

+0

समर्थित नहीं त्रुटि फेंकता – ppumkin