0

我需要从 Web 服务中获取大量 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());

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

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

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

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

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

提前致谢 :)

4

1 回答 1

0

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

在 web 服务超时的情况下,任务应该暂停一段时间然后重试。

[编辑:] 对于处理重试,您可以在重试之间使用指数增加的间隔(就像 TCP/IP 一样) - 这样您将获得快速重新连接,以防超时只是非常暂时的并且服务器负载将被缓解快速,以防它严重超载。

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

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

于 2012-05-22T09:24:02.420 回答