2008-09-29 5 views
33

Ich versuche, einen HTTP-Antwortstrom zweimal über die folgenden zu lesen:Wie kann ich einen HTTP-Antwort-Stream zweimal in C# lesen?

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(); 

jedoch, wenn der Stream Code ausführt dort zurückgegeben keine Daten, weil der Strom das Ende erreicht hat jetzt. Ich habe versucht, den Stream über stream.Position = 0 zurückzusetzen, aber dies löst eine Ausnahme aus (ich denke, weil die Position des Streams nicht manuell geändert werden kann).

Grundsätzlich möchte ich den Stream für XML analysieren und Zugriff auf die Rohdaten (im String-Format) haben.

Irgendwelche Ideen?

Antwort

64

Kopieren Sie es zuerst in einen neuen MemoryStream. Dann können Sie die Memory so oft neu zu lesen, wie Sie möchten:

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

Ein winziger Vorschlag hier - ich oft Anrufe sehen zu suchen, wo die Eigenschaft Position einfacher und besser lesbar wäre, z.B. ms.Position = 0; Nur ein Gedanke für zukünftigen Code. –

+8

Ein weiterer Kommentar - die oben genannten endet nicht den eingehenden Stream, jemals schließen. Es könnte sich lohnen, eine "CopyAndClose" -Methode zu erstellen, die * den Stream schließt, nur damit Sie die einfache Aufrufsyntax beibehalten können. –

+0

Wow, komm her zu meinen Helden .. Ich lese gerade dein Buch, Mr. Skeet :-) Was du zum Schließen (und Erzählen mit dem Methodennamen) vorgeschlagen hast, ist genau das, was ich über den obigen Code dachte. – VVS

-1

Haben Sie versucht, die Stream-Position zurückzusetzen? Wenn dies nicht funktioniert, können Sie den Stream in einen MemoryStream kopieren und dort die Position (d. H. Auf 0) beliebig oft zurücksetzen.

+0

Wirft Fehler nicht unterstützt – ppumkin