C# - 抓取XML RESTful Web服务

时间:2012-05-22 09:16:28

标签: c# xml web-services rest

我需要从网络服务中获取大量xml数据。

我使用像此片段

这样的任务发送异步请求
LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(10);
TaskFactory factory = new TaskFactory(lcts);
List<Task> tasks = new List<Task>();
...
tasks.Add(factory.StartNew(() => GetRecords(country, names)));
...
Task.WaitAll(tasks.ToArray());

webservice在后端有很多工作要做,因此很多请求都会超时,或者我从Web服务收到一般错误。

我试图首先调整LimitedConcurrencyLevelTask​​Scheduler的数量来解决这个问题。

有些XML的大小为2Mb,所以我用XmlReader读取了流,我使用XmlNode node = new XmlDocument().ReadNode(reader);来获取我需要的数据,但有时程序崩溃或进入deadloop(我想原因是不正确的) web服务的xml响应。)

我认为直接从整个响应创建XDoc更糟糕。

你能建议我一个可能的可靠解决方案吗?

提前致谢:)

1 个答案:

答案 0 :(得分:0)

如果格式错误的XML是问题的根源,您应该只将XML响应作为字符串进行爬网并在本地保存/排队以进行后续处理,随着时间的推移您可以改进,因为您在查看解析时遇到的错误类型抓取XML。

如果是Web服务超时,任务应该暂停一段时间,然后再重试。

<强> [编辑:] 对于处理重试,您可以在重试之间使用指数增加的间隔(就像TCP / IP那样) - 这样,如果超时只是非常临时的话,您将获得快速重新连接,并且如果服务器负载很快就会缓解严重超负荷。

重试之间的间隔序列可以是例如。 1,2,4,8秒,......最多32秒或另一个经验值,这将是您的最大重试间隔。

您还应该保留未能下载的积压条目 - 超时可能不是唯一的原因。