2008-09-29 6 views
33

Je suis en train de lire un flux de réponse Http deux fois par ce qui suit:Comment puis-je lire un flux de réponse Http deux fois en C#?

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

Toutefois, lorsque le code StreamReader exécute il n'y a pas de données renvoyées parce que le flux a atteint la fin. J'ai essayé de réinitialiser le flux via stream.Position = 0 mais cela déclenche une exception (je pense que le flux ne peut pas être modifié manuellement).

Fondamentalement, je voudrais analyser le flux pour XML et avoir accès aux données brutes (au format de chaîne).

Des idées?

Répondre

64

Copiez-le d'abord dans un nouveau MemoryStream. Ensuite, vous pouvez relire le MemoryStream autant de fois que vous le souhaitez:

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

Une suggestion minuscule ici - Je vois souvent des appels à Seek où la propriété de position serait plus simple et plus facile à lire, par exemple ms.Position = 0; Juste une pensée pour le code futur. –

+8

Un autre commentaire - ce qui précède ne finit pas la fermeture du flux entrant, jamais. Il pourrait être utile de créer une méthode "CopyAndClose" qui * ferme * le flux, juste pour garder la syntaxe d'appel simple. –

+0

Wow, je me rapproche de mes héros ... Je suis en train de lire votre livre, Mr. Skeet :-) Ce que vous avez suggéré de fermer (et dire avec le nom de la méthode) est exactement ce que je pensais du code ci-dessus. – VVS

-1

avez-vous essayé de réinitialiser la position du flux? Si cela ne fonctionne pas, vous pouvez copier le flux dans un MemoryStream et là vous pouvez réinitialiser la position (c'est-à-dire 0) aussi souvent que vous le souhaitez.

+0

Lancers erreur non pris en charge – ppumkin

Questions connexes