2011-08-08 50 views
11

我有Webclient的問題。WebClient很慢

它很慢。從一個網站下載字符串大約需要3-5秒。 我沒有任何網絡問題。

這是我的Modifed WebClient。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace StatusChecker 
{ 
    class WebClientEx: WebClient 
    { 
     public CookieContainer CookieContainer { get; private set; } 

     public WebClientEx() 
     { 
      CookieContainer = new CookieContainer(); 

      ServicePointManager.Expect100Continue = false; 
      Encoding = System.Text.Encoding.UTF8; 

      WebRequest.DefaultWebProxy = null; 
      Proxy = null; 
     } 

     public void ClearCookies() 
     { 
      CookieContainer = new CookieContainer(); 
     } 

     protected override WebRequest GetWebRequest(Uri address) 
     { 

      var request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = CookieContainer; 
      } 
      return request; 
     } 
    } 
} 

UPDATE: 在Wireshark中,我看到一個DownladString發送和接收的幾千個數據包。

+4

Web客戶端是不是特別慢,這個問題必須在別處...也許你下載的網站很慢? –

+1

您應該嘗試使用WireShark等流量記錄器來確定延遲是否確實發生在單個請求幀和響應幀之間(由網絡/服務器變慢引起),或者是因爲客戶端代碼行爲異常併發出太多請求或某些此類邏輯錯誤。 –

+0

同時在一個循環中執行多次下載以「預熱」該過程(例如,消除裝入的程序集)。 –

回答

30

有可能是手頭在這裏(我也注意到在我自己的程序之前)兩個問題:

  • 的第一個請求需要一個異常長時間:這是因爲WebRequest默認首次啓動時會檢測並加載代理設置,這可能需要很長時間。要停止這一點,只需通過代理屬性(WebRequest.Proxy)設置爲null,它會繞過檢查(前提是你可以直接訪問互聯網)
  • 你不能一次下載超過2項:在默認情況下,您只能打開2個同時HTTP連接。要更改此設置,請將ServicePointManager.DefaultConnectionLimit設置爲更大。我通常將其設置爲int.MaxValue(只要確保您不會發送帶有1,000,000個連接的主機垃圾郵件)。
+1

這是不正確的答案在我的情況。你可以看到我已經將代理設置爲null。而且我不會同時下載2項內容。同樣在我的帖子中添加的,在Wireshark中,我可以看到我的應用每個下載字符串發送和接收數千個數據包。字符串是簡單的網站,如google.com。 – Hooch

+0

如果它沒有異常緩慢(意味着連接保持關閉狀態的速度大致相同),那麼它的工作方式應該如此。需要花時間來執行握手,發出請求,等待服務器創建響應,然後讀取響應。 – foxy

+0

你能告訴我更多關於那些保持活着嗎?爲什麼我的應用程序發送數千個數據包? – Hooch

0

也許它會幫助別人。一些Web服務支持壓縮(gzip或其他)。因此,您可以爲您的請求添加Accept-Encoding標頭,然後爲Web客戶端實例啓用automatic decompression。 Chrome以這種方式工作。

0

有幾個選擇,如果是涉及到初始代理設置被檢查:

  1. 在Internet Explorer中禁用自動代理檢測設置
  2. 設置代理爲null:

    WebClient.Proxy = null

  3. 在應用程序啓動時,將默認webproxy設置爲null:

    WebRequest.DefaultWebProxy = null;

在舊的.NET代碼,而不是設置爲空,你用來寫這個(但空現在是首選):

webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy();