我需要从网络服务中获取大量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服务收到一般错误。
我试图首先调整LimitedConcurrencyLevelTaskScheduler的数量来解决这个问题。
有些XML的大小为2Mb,所以我用XmlReader读取了流,我使用XmlNode node = new XmlDocument().ReadNode(reader);
来获取我需要的数据,但有时程序崩溃或进入deadloop(我想原因是不正确的) web服务的xml响应。)
我认为直接从整个响应创建XDoc更糟糕。
你能建议我一个可能的可靠解决方案吗?
提前致谢:)
答案 0 :(得分:0)
如果格式错误的XML是问题的根源,您应该只将XML响应作为字符串进行爬网并在本地保存/排队以进行后续处理,随着时间的推移您可以改进,因为您在查看解析时遇到的错误类型抓取XML。
如果是Web服务超时,任务应该暂停一段时间,然后再重试。
<强> [编辑:] 强> 对于处理重试,您可以在重试之间使用指数增加的间隔(就像TCP / IP那样) - 这样,如果超时只是非常临时的话,您将获得快速重新连接,并且如果服务器负载很快就会缓解严重超负荷。
重试之间的间隔序列可以是例如。 1,2,4,8秒,......最多32秒或另一个经验值,这将是您的最大重试间隔。
您还应该保留未能下载的积压条目 - 超时可能不是唯一的原因。