2009-04-22 2 views
7

Ich versuche herauszufinden, wie man einen kontinuierlichen XML-Datenstrom von einem Dienst, der die Daten als "konstanten" Feed über HTTP sendet, am besten konsumiert.C# - Wie man einen kontinuierlichen XML-Stream über HTTP liest

Ich habe erwogen, HttpWebRequest/Response zu verwenden, aber ich bin mir nicht sicher, wie sich das verhalten wird, wenn die Daten einfach kontinuierlich streamen.

Irgendwelche Gedanken?

Antwort

9

Ich habe dies zuvor getan, nicht mit XML, aber mit Daten, die für Zustandsänderungen für eine Anwendung analysiert werden müssen. Die Methode HttpWebResponse.GetResponseStream() hat dafür gut funktioniert. Vergewissern Sie sich, dass Sie Close() in diesem Stream aufrufen, wenn Sie fertig sind. Ich schlage einen Endblock vor.

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

Oder alternativ:

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

Ich denke, es sind einige kleine Korrekturen nötig, damit der Code funktioniert. Es gibt keine 'HttpWebRequest.GetResponseStream()' Methode. Sie müssen ein 'HttpWebResponse'-Objekt mit' HttpWebRequest.GetResponse() 'abfragen und' GetResponseStream() 'darauf aufrufen. Auch im 'finally' Block ist' req' nicht zu verwenden, sondern die zuvor erwähnte 'Response'. – scherand

+0

stimmte zu, ich tippte es einfach aus dem Speicher, nicht aus einem tatsächlichen Projekt. – esac

+0

Wie würde das mit XML funktionieren? Das XML wäre ungültig, bis das ganze XML-Dokument heruntergeladen worden wäre, was den Zweck des Streams vereitelt. – swestner

2

sollte in der Lage sein, es ist ziemlich einfach zu tun. Sie müssen den Antwortstream abrufen, indem Sie Response.GetResponseStream() aufrufen und dann den asynchronen ResponseStream.BeginRead() in einer Schleife verwenden.

Es gibt keine Timeout-Einstellung für die Antwort, aber wenn Sie ständig Daten gesendet bekommen, sollte es in Ordnung sein.