1

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

4

2 回答 2

2

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

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

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

于 2013-10-12T11:30:50.300 回答
0

你试过把线

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

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

while (count > 0);

在循环之外获取响应流的实例也可能会有所帮助。GetResponseStream()在每个循环上进行调用可能会产生无法预料的后果。

于 2013-10-12T11:19:07.693 回答