2012-10-29 41 views
15

有什麼方法可以使用WebClient的襪子代理嗎?特別是它提供的DownloadString方法?使用WebClient和襪子代理

我不想使用任何第三方的東西,如privoxy,freecap什麼,我不能使用像Chilkat那樣的商業庫。我嘗試使用http://www.mentalis.org/的東西,實際上我使用了他們的WebRequest實現,但它們似乎沒有類似的WebClient。

回答

14

SOCKS不被WebRequest/WebResponse類和擴展直接支持,在WebClient類(它依賴於WebRequest做的工作)。

這真的不能,因爲它工作在傳輸層(TCP/IP),而不是通過簡單的重定向到HTTP請求轉發(這就是WebRequest/WebResponse類工作的級別)的服務器。

您可以創建一個specialized derivation of WebRequest/WebResponse(使用ProxySocket處理低級別的握手,然後),然後創建一個專門WebClient class將覆蓋GetWebRequestGetWebResponse方法。

一旦您將該類替換爲您的WebClient實例,它應該像正常一樣工作(您可能必須在每種情況下都使用它來設置代理)。

-2

這裏是我終於實現了,謝謝casperOne的回答

public class SocksWebClient : WebClient 
{ 
    public IProxyDetails ProxyDetails { get; set; } 
    public string UserAgent { get; set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest result = null; 

     if (ProxyDetails != null) 
     { 
      if (ProxyDetails.ProxyType == ProxyType.Proxy) 
      { 
       result = (HttpWebRequest)WebRequest.Create(address); 
       result.Proxy = new WebProxy(ProxyDetails.FullProxyAddress); 
       if (!string.IsNullOrEmpty(UserAgent)) 
        ((HttpWebRequest)result).UserAgent = UserAgent; 
      } 
      else if (ProxyDetails.ProxyType == ProxyType.Socks) 
      { 
       result = SocksHttpWebRequest.Create(address); 
       result.Proxy = new WebProxy(ProxyDetails.FullProxyAddress); 
       //TODO: implement user and password 

      } 
      else if (ProxyDetails.ProxyType == ProxyType.None) 
      { 
       result = (HttpWebRequest)WebRequest.Create(address); 
       if (!string.IsNullOrEmpty(UserAgent)) 
        ((HttpWebRequest)result).UserAgent = UserAgent; 
      } 
     } 
     else 
     { 
      result = (HttpWebRequest)WebRequest.Create(address); 
      if (!string.IsNullOrEmpty(UserAgent)) 
       ((HttpWebRequest)result).UserAgent = UserAgent; 
     } 

     return result; 
    } 
} 

我在尋找相同的代碼,但它並不真正爲我工作。我想知道你在哪裏得到IProxyDetails -Object。它似乎不是在博客中實現,而不是在文件,我從那裏得到

+0

這不是一個答案。你應該已經評論過他的答案。但你是對的。他的回答不應該被認爲是不完整的。 – C4u

1

我碰到這個藏漢,發現漂亮的BetterHttpClient

從WebClient的派生,並允許您指定一個socks代理:

BetterHttpClient.HttpClient client = new BetterHttpClient.HttpClient(new BetterHttpClient.Proxy("IP address", port, BetterHttpClient.ProxyTypeEnum.Socks));