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

时间:2013-10-12 11:15:21

标签: c# xml httpwebrequest

我正在连接(使用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函数会导致异常。 我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果“连续”意味着没有结束,那么你就不应该使用DataSet,因为这不是设计成像这样使用。

话虽这么说,你遇到的问题是你正在阅读的网络数据可以任意分割成碎片,这样你甚至不会得到有效的XML碎片。相反,您应该在响应流上使用XmlReader并从中读取,因为这会将碎片重新组合在一起。

但是,直接将其传递给ReadXml()将无法解决问题,因为它永远不会停止。所以你可能最终得到的是一些简单的代码,从XmlReader读取解析后的片段,然后手动将它们插入到你想要的任何数据存储中。

答案 1 :(得分:0)

您是否尝试过该行

dataSet.ReadXml(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(read)));
在do-while循环之外的

,然后使用while子句仅计算count:

while (count > 0);

在循环外部获取响应流的实例也很有帮助。通过GetResponseStream()调用每个循环可能会产生不可预见的后果。