2012-05-22 49 views
0

我需要从web服务获取大量xml数据。C# - 爬行XML RESTful web服务

我送使用任务异步请求,这样的片段

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服务有很多工作在后台等了大量请求,在超时去还是我收到一般错误从WebService做。

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

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

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

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

感谢提前:)

+0

它是asmx还是WCF Web服务? –

+0

REST风格的远程web服务,不知道技术:) – JoinZ

+0

那么你想如何提高它的性能?因为如果您从Web服务接收到超时错误,那么客户端可以做的事情就不多了。除了让你的等待时间更长。 –

回答

0

如果格式不正确的XML是问题的根源,你应该只抓取为字符串的XML响应,并保存/本地队列他们正如你看到,你可以随着时间不断改进后续处理解析已爬网XML时收到的错误种类。

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

[编辑:] 对于处理重试,你可以使用重试之间(就像TCP/IP做它)指数增加间隔 - 这样你会得到快速重新连接的情况下,超时只是非常暂时的,如果服务器负载严重超载,服务器负载将迅速缓解。

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

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

+0

谢谢Marek,我只是想分离抓取过程和响应分析过程,并且您的解决方案非常好。 关于暂停任务现在我正在使用类似'System.Threading.Thread.Sleep(10000);'和我重新发送请求;我应该找到更好的解决方案。 对于积压行为,我只是在做,谢谢;) – JoinZ

+0

您可以在重试之间使用增加的时间间隔 - 请参阅编辑。 – Marek