2009-04-22 19 views
7

Verileri, HTTP üzerinden "sabit" bir besleme olarak gönderen bir hizmetten sürekli bir XML veri akışı tüketmenin en iyi yolunu bulmaya çalışıyorum.C# - HTTP üzerinden sürekli XML akışı nasıl okunur?

Ben HttpWebRequest/yanıt kullanarak düşündüğünü ama veriler sadece sürekli akışları eğer nasıl davranacağını emin değilim.

Herhangi bir düşünce?

cevap

9

Bunu daha önce XML ile değil, bir uygulama için durum değişikliği için ayrıştırılması gereken verilerle yaptım. HttpWebResponse.GetResponseStream() yöntemi bunun için iyi çalıştı. İşiniz bittiğinde bu akıştaki Close() öğesini çağırdığınızdan emin olun. Sonunda bir engel öneririm. alternatif

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

Veya:

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

Kodun çalışması için bazı küçük düzeltmelerin yapılması gerektiğini düşünüyorum. HttpWebRequest.GetResponseStream() yöntemi yoktur. Sen 'HttpWebRequest.GetResponse()' kullanarak 'HttpWebResponse' nesneyi almak gerekir ve bu konuda' GetResponseStream() 'diyoruz. Ayrıca 'nihayet' bloğunda 'req' kullanılmayacak, daha önce de belirtilen 'Response'. – scherand

+0

ben sadece gerçek bir projesinden, bellekten dışarı daktilo, kabul etti. – esac

+0

Bu XML ile nasıl çalışır? XML, tüm xml dokümanı indirilene kadar geçersiz olurdu, bu tür akışları amaçlayan bir yenilgi. – swestner

2

oldukça kolay bunu yapmak mümkün olmalıdır. Response.GetResponseStream() öğesini çağırıp yanıt döngüsünü almanız ve ardından bir döngüde ResponseStream.BeginRead() işlevini kullanmanız gerekir.

Yanıtta Zamanaşımı ayarı yok, ancak sürekli olarak veri gönderiyorsanız, sorun iyi olmalıdır.

İlgili konular