在服务器不断推送 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 函数会导致异常。我该怎么做才能解决这个问题?

在服务器不断推送 xml 时使用 dataSet.ReadXml

如果"连续"是指永无止境,那么您不应该使用 DataSet,因为它不是为这样使用而设计的。

话虽如此,您遇到的问题是您正在读取的网络数据可以被任意切割成碎片,因此您甚至无法获得有效的 XML 片段。相反,您应该在响应流上使用XmlReader并从中读取,因为这会将各个部分重新组合在一起。

但是,直接将其传递给ReadXml()不会起作用,因为它永远不会停止。因此,您最终可能会得到一些简单的代码,从XmlReader中读取解析的片段,并手动将它们插入到您想要的任何数据存储中。

你试过放线吗

dataSet.ReadXml(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(read)));

在 do-while 循环之外,然后让 while 子句仅计算计数:

while (count > 0);

将响应流的实例获取到循环之外也可能很有帮助。在每个循环中都进行GetResponseStream()调用可能会产生不可预见的后果。