2012-05-22 62 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