【问题标题】:Using dataSet.ReadXml when the server is continuously pushing xml当服务器持续推送 xml 时使用 dataSet.ReadXml
【发布时间】:2013-10-12 19:30:50
【问题描述】:

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

【问题讨论】:

    标签: c# xml httpwebrequest


    【解决方案1】:

    如果你所说的“持续”是指没有结束,那么你不应该使用 DataSet,因为它不是为这样使用而设计的。

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

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

    【讨论】:

    • 你说得对,我想最后我必须这样做,我真的讨厌它。
    • 好吧,您可能想研究 MS .NET XML 类的替代方案以获得流评估支持。我相信VTD-XMLSaxon 内置了这种支持。
    【解决方案2】:

    你试过放线吗

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

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

    while (count > 0);
    

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

    【讨论】:

    • 是的,但我们并没有摆脱困境。它将无法访问。
    • 刚刚在我最初的回答中添加了一些建议
    • 没有变化,真正的问题是卢塞罗所说的。我想我必须忘记使用 dataset.ReadXml()
    • 是的 - 我错过了关于“持续”的关键部分 - 很高兴你明白了 ;-)
    猜你喜欢
    • 2016-06-14
    • 2015-06-03
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多