2012-10-29 47 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));