C# 在服务器持续推送xml时使用dataSet.ReadXml
我正在连接(使用HttpWebRequest和HttpWebResponse)到一个不断推送XML数据的服务器。我需要的是读取数据并将其存储到在线数据集中。 目前我所做的就是:C# 在服务器持续推送xml时使用dataSet.ReadXml,c#,xml,httpwebrequest,C#,Xml,Httpwebrequest,我正在连接(使用HttpWebRequest和HttpWebResponse)到一个不断推送XML数据的服务器。我需要的是读取数据并将其存储到在线数据集中。 目前我所做的就是: HttpWebRequest httpRequest; string url = "something"; System.Data.DataSet dataSet = new System.Data.DataSet(); httpRequest = (Htt
HttpWebRequest httpRequest;
string url = "something";
System.Data.DataSet dataSet = new System.Data.DataSet();
httpRequest = (HttpWebRequest)WebRequest.Create(url);
httpRequest.Credentials = new NetworkCredential("username", "pass");
ServicePointManager.ServerCertificateValidationCallback = ((sender1, certificate, chain, sslPolicyErrors) => true);
byte[] buf = new byte[1024];
HttpWebResponse response;
int count = -1;
string read = string.Empty;
response = (HttpWebResponse)httpRequest.GetResponse();
do
{
count = response.GetResponseStream().Read(buf, 0, buf.Length);
read += Encoding.UTF8.GetString(buf, 0, count);
dataSet.ReadXml(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(read)));
} while (response.GetResponseStream().CanRead && count != 0);
但是,由于在每个循环中都会收到xml数据的一部分,因此ReadXml函数将导致异常。
我能做些什么来解决这个问题呢?你试过排队吗
dataSet.ReadXml(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(read)));
在do while循环之外,然后使while子句仅计算计数:
while (count > 0);
将响应流的实例置于循环之外也会很有帮助。在每个循环上调用GetResponseStream()
可能会产生不可预见的后果。如果“连续”的意思是没有结束,那么您不应该使用数据集,因为它不是这样设计的
也就是说,您所面临的问题是,您正在读取的网络数据可能会被任意切割成碎片,因此您甚至无法获得有效的XML片段。相反,您应该在响应流上使用XmlReader
,并从中读取,因为这将把各个部分重新组合在一起
但是,直接将其传递到
ReadXml()
不会起作用,因为它永远不会停止。因此,您可能会得到一些简单的代码,从XmlReader
读取解析后的片段,然后手动将这些片段插入到您想要的任何数据存储中。是的,但我们不会脱离循环。只是在我最初的回答中增加了一些建议没有改变,真正的问题是卢塞罗所说的。我想我必须忘记使用dataset.ReadXml()是的-我错过了关于“持续”的关键部分-很高兴你弄明白了;-)你说得对,我想最后我必须这么做,我真的很讨厌这样做。好吧,为了获得流式计算支持,你可能想研究MS.NET XML类的替代方案。我相信这一点,并且有这种内在的支持。