我正在连接(使用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函数会导致异常。 我该怎么做才能解决这个问题?
答案 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()
调用每个循环可能会产生不可预见的后果。