在服务器不断推送 xml 时使用 dataSet.ReadXml
本文关键字:dataSet ReadXml xml 服务器 | 更新日期: 2023-09-27 18:35:15
我正在连接(使用HttpWebRequest和HttpWebResponse)到一个不断推送XML数据的服务器。 我需要的是读取数据并将它们在线存储到数据集中。目前这是我所做的:
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,因为它不是为这样使用而设计的。
话虽如此,您遇到的问题是您正在读取的网络数据可以被任意切割成碎片,因此您甚至无法获得有效的 XML 片段。相反,您应该在响应流上使用XmlReader
并从中读取,因为这会将各个部分重新组合在一起。
但是,直接将其传递给ReadXml()
不会起作用,因为它永远不会停止。因此,您最终可能会得到一些简单的代码,从XmlReader
中读取解析的片段,并手动将它们插入到您想要的任何数据存储中。
你试过放线吗
dataSet.ReadXml(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(read)));
在 do-while 循环之外,然后让 while 子句仅计算计数:
while (count > 0);
将响应流的实例获取到循环之外也可能很有帮助。在每个循环中都进行GetResponseStream()
调用可能会产生不可预见的后果。