2009-04-22 18 views
7

Estoy tratando de encontrar la mejor manera de consumir una secuencia continua de datos XML de un servicio que está enviando los datos como un feed "constante" a través de HTTP.C# - Cómo leer una secuencia continua de XML a través de HTTP

Estaba considerando utilizar HttpWebRequest/Response, pero no estoy seguro de cómo se comportará si los datos se transmiten de forma continua.

¿Alguna idea?

Respuesta

9

He hecho esto antes, no con XML, pero con datos que deben ser analizados para cambios de estado para una aplicación. El método HttpWebResponse.GetResponseStream() funcionó bien para esto. Asegúrese de llamar a Close() en esta secuencia cuando haya terminado. Sugiero un bloqueo final.

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

O, alternativamente:

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

Creo que hay algunas pequeñas correcciones necesarias para que el código funcione. No hay un método 'HttpWebRequest.GetResponseStream()'. Necesitas obtener un objeto 'HttpWebResponse' usando' HttpWebRequest.GetResponse() 'y llamar' GetResponseStream() 'sobre eso. También en el bloque 'finally'' req' no se debe utilizar, sino la 'Respuesta' mencionada anteriormente. – scherand

+0

de acuerdo, lo escribí en la memoria, no en un proyecto real. – esac

+0

¿Cómo funcionaría esto con XML? El XML no sería válido hasta que todo el documento xml se haya descargado, lo que de alguna manera frustra el propósito de la transmisión. – swestner

2

Debe ser capaz de hacerlo con bastante facilidad. Deberá obtener el flujo de respuesta llamando a Response.GetResponseStream() y luego usar el async ResponseStream.BeginRead() en un bucle.

No hay configuración de tiempo de espera en la respuesta, pero si se envían datos constantemente, entonces debería estar bien.

Cuestiones relacionadas