2011-10-23 55 views
4

我正在研究一個使用公共XML提要進行計算的C#項目。我最初使用XmlDocument.Load,但遷移到WebClient.DownloadString,所以我可以include headers in my request.我正在訪問的訂閱源通常會很快響應,但它每次都會在WebClient對象的超時期限內響應失敗,並且出現異常。這裏是我的代碼:用WebClient替代防止超時?

XmlDocument xmlDoc = new XmlDocument(); 

Webclient client = new WebClient(); 
client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; 
client.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

string data = client.DownloadString(/*URL*/); 

xmlDoc.LoadXml(data); 

我讀過,你不能改變的WebClient的超時屬性,誰都有這個問題的人應該使用HttpWebRequest的來代替。不幸的是,我不知道如何去實現這個功能,它仍然允許我使用我的頭文件並將結果發送給xmlDoc。由於此應用程序的性質,我不在乎接收數據需要多長時間;我可以處理提醒用戶。

要做到這一點,最好的方法是什麼?

+1

你有什麼問題與'HttpWebRequest'? – SLaks

回答

16

你可以使用這個WebClient派生類,它只是增加你想爲每個超時取:

public class TimeoutWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
     request.Timeout = 60000; //1 minute timeout 
     return request; 
    } 
} 

如果使用TimeoutWebClient代替WebClient現在,你得到的超時行爲你要。如果您需要的自定義標頭對於每個請求都是相同的,那麼您可以在這裏添加這些標頭,並且您的調用代碼保持非常乾淨。

+0

只需確認一下,我就可以將您的代碼粘貼到任何ol位置,然後使用與WebClient完全相同的TimeoutWebClient? – Sonic42

+0

@ Sonic42:是的,這是正確的 – BrokenGlass

+0

總是值得添加的Web客戶端是IDisposable,因此,這樣將TimeoutWebClient;讓你的'使用':) –

1
XmlDocument xmlDoc = new XmlDocument(); 

HttpWebRequest request = new (HttpWebRequest)WebRequest.Create(/*URL*/); 
request.Headers = new WebHeaderCollection(); 
// fill in request.Headers... 

// The response is presented as a stream. Wrap it in a StreamReader that 
// xmlDoc.LoadXml can accept. 
xmlDoc.LoadXml(new StreamReader(request.GetResponse().GetResponseStream()); 
0

您可以捕捉到異常,然後重新發出請求。你可能想在這裏放置一些其他的邏輯在一定次數的失敗嘗試後中止。

bool continue; 
do{ 
    continue = false;  
    try { 
     string data = client.DownloadString(/*URL*/); 
    } 
    catch (WebException e) { 
     continue = true; 
    } 
} 
while(continue); 
+0

@MystereMan如果服務器速度很慢並且每次都在10分鐘內響應呢? –

+0

如果請求成功,那不會創建無限循環嗎? – Sonic42

+0

@ L.B - 他說它通常反應很快,只是偶爾會超時。這可能是服務器中止並且永遠不會完成請求,所以長時間的超時將會等到它超時多久。 –