2010-12-11 60 views
34

當使用System.Net.WebClient.DownloadData()方法時,我得到的響應時間不合理。System.Net.WebClient不合理地慢

在.NET中使用WebClient類獲取URL時,在獲得響應之前需要大約10秒,而瀏覽器在1秒內獲取相同頁面。 這與數據的大小爲0.5kB或更小。

該請求涉及POST/GET參數和用戶代理頭,如果這可能會導致問題。

我還沒有嘗試過,如果其他方式下載數據在.NET中給我同樣的問題,但我懷疑我可能會得到類似的結果。 (我一直有一種感覺,在.NET中的web請求異常緩慢...)

這可能是什麼原因?

編輯:
我試着用System.Net.HttpWebRequest代替,使用下面的方法做完全相同的事,所有的請求下1秒完成英寸

public static string DownloadText(string url) 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     var response = (HttpWebResponse)request.GetResponse(); 

     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      return reader.ReadToEnd(); 
     } 
} 


在使用System.Net.WebClient此(舊)方法需要15-30s爲每個請求完成:

public static string DownloadText(string url) 
{ 
     var client = new WebClient(); 
     byte[] data = client.DownloadData(url); 
     return client.Encoding.GetString(data); 
} 
+0

相關:http://stackoverflow.com/questions/4932541 – 2015-10-11 04:58:05

回答

2

下載Wireshark的這裏http://www.wireshark.org/

捕獲網絡數據包和過濾「HTTP 「包。 它應該立即給你答案。

+1

wireshark上沒有什麼奇怪的,但跟蹤打印我可以看到WebClient.DownloadData()被調用,GET請求不會出現在wireshark上,直到10左右-30s以後(取決於「凍結」時間)。 它看起來像減慢速度不是請求本身,而是在實際GET請求之前完成的事情。 – moevi 2010-12-12 02:57:09

+1

它看起來像你的客戶正在等待某事的超時。大多數情況下,它正在等待DNS超時或NetBIOS超時。您可以嘗試過濾掉DNS數據包和NetBIOS數據包。或者,您可以嘗試通過源IP地址進行過濾。這應該告訴你在GET請求之前你的客戶端發出的最後一個數據包是什麼。也許,@布魯肯管是對的。它可能正在等待代理。 – 2010-12-12 16:51:58

0

關於.NET Web請求沒有什麼本質上緩慢的;該代碼應該沒問題。我經常使用WebClient,它的工作速度非常快。

每個方向的有效載荷有多大?愚蠢的問題也許,但它只是帶寬限制?

IMO最有可能的是,你的網站已經脫離下來,當你點擊的URL的網站響應速度慢。這不是客戶的錯。由於某些原因,DNS也可能很慢(在這種情況下,您可以將IP硬編碼到「主機」文件中),或者中間的一些代理服務器速度較慢。

如果Web站點是不是你的,它也有可能是他們正在檢測非典型用法和故意注入延遲惹惱刮刀。

我會抓住Fiddler(一個免費的,簡單的網站督察),看看時機。

0

你用什麼瀏覽器來測試?

嘗試使用默認的IE安裝。 System.Net.WebClient使用本地IE設置,代理等也許這已經被破壞?

73

我有WebRequest的這個問題。嘗試設置Proxy = null;

WebClient wc = new WebClient(); 
    wc.Proxy = null; 

默認Web客戶端,WebRequest的嘗試確定從IE設置使用的代理服務器,有時它會導致像5秒的延遲發送的實際請求之前。

這適用於所有使用WebRequest的類,包括帶有HTTP綁定的WCF服務。 一般來說,你可以在應用程序啓動時使用此靜態代碼:

WebRequest.DefaultWebProxy = null; 
+2

當我這樣做時,我獲得了巨大的速度提升。謝謝! – mpen 2012-05-12 15:36:10

+1

第二個在我的情況下造成巨大的差異!這絕對是這些WebProxies的「特性」的放緩。 – 2012-07-23 12:10:43

+0

有同樣的問題,這真的提高了響應時間! – gigi 2012-10-08 13:20:54

0

Web客戶端可能會慢一些工作站時,自動代理服務器設置在IE設置檢查(連接選項卡 - 局域網設置)。

0

WebClient下載非常慢的另一個原因是您要下載的目標媒體。如果它是一個像USB鑰匙這樣的慢速設備,這可能會大大影響下載速度。對於我的硬盤,我可以以每秒6MB的速度下載我的USB密鑰,但只能以700kb/s的速度下載,即使我可以從另一個驅動器以5MB /秒的速度將文件複製到此USB。 wget顯示相同的行爲。這也是在這裏報道:

https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow

因此,如果這是你的情況下,另一種解決方案是下載完成後,將文件下載到硬盤,然後再複製到慢的媒介。