2012-01-11 25 views
2

我有一個返回網頁內容的方法:DownloadString超時

 private string FetchHTML(string sUrl, Encoding encoding) 
     { 
      System.Net.WebClient oClient = new System.Net.WebClient(); 
      oClient.Encoding = encoding; 
      return System.Web.HttpUtility.HtmlDecode(oClient.DownloadString(sUrl)); 
     } 

但是,當我嘗試從LiveJournal的加載鏈接(例如,http://mos-jkh.livejournal.com/769579.html)然後我得到這個例外在DownloadString:

請求被中止:操作已超時。

這是一個已知問題嗎?爲什麼DownloadString不適用於某些網頁,並且是否有解決方案?或者有沒有替代DownloadString?

+0

您能否舉一個例子,說明您發佈的鏈接之外超時的網址?也許比livejournal更不值得信賴?這也有助於查看您用來調用'FetchHTML'的特定代碼(可能用任何變量代替它們代表的值)。 – 2012-01-11 05:24:34

回答

8

有些網站很智能,可以檢查請求是否由瀏覽器完成。當他們檢測到請求沒有通過瀏覽器完成時,他們沒有迴應。但通過簡單地向用戶代理信息發送請求來欺騙他們很容易。所以溶液加入一行代碼到FetchHTML方法:

private string FetchHTML(string sUrl, Encoding encoding) 
    { 
     System.Net.WebClient oClient = new System.Net.WebClient(); 
     oClient.Encoding = encoding; 
     // set the user agent to IE6 
     oClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"); 
     return System.Web.HttpUtility.HtmlDecode(oClient.DownloadString(sUrl)); 
    } 

PS:爲了檢測我用Fiddler代替Wireshark的,我已經找到了過於複雜的問題。

1

那麼,例外說,操作超時。這似乎是一個非常合理的事情發生了一些時間 - 可能會有緩慢的服務器,緩慢的互聯網連接等 - 如果您嘗試從同一主機下載多個網頁,則會使用連接池,這可能導致此即使每個單獨的請求看起來沒問題都會發生。

使用諸如Wireshark之類的方法來確定網絡級別正在發生的事情。