我正在尝试找出从服务中获取连续XML数据流的最佳方法,该服务将数据作为“常量”Feed通过HTTP发送。
我正在考虑使用HttpWebRequest / Response但我不确定如果数据只是连续流式传输会如何。
有什么想法吗?
答案 0 :(得分: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();
}
答案 1 :(得分:2)
应该能够相当容易地做到这一点。您需要通过调用Response.GetResponseStream()获取响应流,然后在循环中使用异步ResponseStream.BeginRead()。
响应中没有超时设置,但如果您一直收到数据,那么它应该没问题。