2009-04-22 4 views
7

Я пытаюсь найти лучший способ использовать непрерывный поток данных XML из службы, которая отправляет данные как «постоянную» передачу по HTTP.C# - Как читать непрерывный поток XML через HTTP

Я рассматривал возможность использования HttpWebRequest/Response, но я не уверен, как это будет вести себя, если данные просто будут непрерывно потоками.

Любые мысли?

ответ

9

Я сделал это раньше, а не с XML, но с данными, которые необходимо было проанализировать для изменений состояния для приложения. Метод HttpWebResponse.GetResponseStream() отлично справился с этим. Обязательно вызовите Close() в этом потоке, когда закончите. Я предлагаю, наконец, блок.

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

Или, наоборот:

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

Я думаю, что есть некоторые небольшие исправления, необходимые для работы кода. Нет метода 'HttpWebRequest.GetResponseStream()'. Вам нужно получить объект «HttpWebResponse» с помощью 'HttpWebRequest.GetResponse()' и называть 'GetResponseStream()' на этом. Также в блоке 'finally'' req' не будет использоваться, кроме вышеупомянутого 'Response'. – scherand

+0

согласился, я просто напечатал его из памяти, а не из реального проекта. – esac

+0

Как это работает с XML? XML недействителен до тех пор, пока не будет загружен весь xml-документ, какой тип проигрывает цель потоковой передачи. – swestner

2

Должно быть в состоянии сделать это довольно легко. Вам нужно будет получить поток ответов, вызвав Response.GetResponseStream(), а затем использовать async ResponseStream.BeginRead() в цикле.

В ответ не установлен параметр Тайм-аут, но если вы последовательно отправляете данные, тогда все должно быть хорошо.