2009-04-22 9 views
7

J'essaie de trouver la meilleure façon de consommer un flux continu de données XML à partir d'un service qui envoie les données sous forme de flux "constant" sur HTTP.C# - Comment lire un flux continu de XML sur HTTP

J'envisageais d'utiliser HttpWebRequest/Response, mais je ne suis pas sûr de savoir comment cela se comportera si les données sont diffusées en continu.

Des pensées?

Répondre

9

Je l'ai déjà fait, pas avec XML, mais avec des données qui devaient être analysées pour les changements d'état d'une application. La méthode HttpWebResponse.GetResponseStream() a bien fonctionné pour cela. Assurez-vous d'appeler Close() sur ce flux lorsque vous avez terminé. Je suggère un blocage définitif.

HttpWebRequest req; 

try 
{ 
    req = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
    Stream stream = req.GetResponseStream(); 

    byte[] data = new byte[4096]; 
    int read; 
    while ((read = data.Read(data, 0, data.Length)) > 0) 
    { 
     Process(data, read); 
    } 
} 
finally 
{ 
    if (req != null) 
     req.Close(); 
} 

Ou encore:

HttpWebRequest req; 

try 
{ 
    req = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
    Stream stream = req.GetResponseStream(); 

    XmlTextReader reader = new XmlTextReader(stream); 

    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
     case XmlNodeType.Element: 
      Console.Write("<{0}>", reader.Name); 
      break; 
     case XmlNodeType.Text: 
      Console.Write(reader.Value); 
      break; 
     case XmlNodeType.CDATA: 
      Console.Write("<![CDATA[{0}]]>", reader.Value); 
      break; 
     case XmlNodeType.ProcessingInstruction: 
      Console.Write("<?{0} {1}?>", reader.Name, reader.Value); 
      break; 
     case XmlNodeType.Comment: 
      Console.Write("<!--{0}-->", reader.Value); 
      break; 
     case XmlNodeType.XmlDeclaration: 
      Console.Write("<?xml version='1.0'?>"); 
      break; 
     case XmlNodeType.Document: 
      break; 
     case XmlNodeType.DocumentType: 
      Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); 
      break; 
     case XmlNodeType.EntityReference: 
      Console.Write(reader.Name); 
      break; 
     case XmlNodeType.EndElement: 
      Console.Write("</{0}>", reader.Name); 
      break; 
     }  

    }  
} 
finally 
{ 
    if (req != null) 
     req.Close(); 
} 
+3

Je pense qu'il y a quelques petites corrections nécessaires pour que le code fonctionne. Il n'y a pas de méthode 'HttpWebRequest.GetResponseStream()'. Vous devez obtenir un objet 'HttpWebResponse' en utilisant' HttpWebRequest.GetResponse() 'et appeler' GetResponseStream() 'sur cela. Toujours dans le bloc 'finally',' req' ne doit pas être utilisé, mais la 'Response' mentionnée ci-dessus. – scherand

+0

convenu, je l'ai juste tapé de la mémoire, pas d'un projet réel. – esac

+0

Comment cela fonctionnerait-il avec XML? Le XML serait invalide jusqu'à ce que l'ensemble du document XML a été téléchargé, ce qui va à l'encontre du but du streaming. – swestner

2

devrait être en mesure de le faire assez facilement. Vous devrez obtenir le flux de réponse en appelant Response.GetResponseStream(), puis utiliser le ResponseStream.BeginRead() asynchrone dans une boucle.

Il n'y a pas de paramètre Timeout sur la réponse, mais si vous recevez systématiquement des données envoyées, cela devrait fonctionner correctement.

Questions connexes