有什么方法可以使用WebClient
的袜子代理吗?特别是它提供的DownloadString
方法?使用WebClient和袜子代理
我不想使用任何第三方的东西,如privoxy,freecap什么,我不能使用像Chilkat那样的商业库。我尝试使用http://www.mentalis.org/的东西,实际上我使用了他们的WebRequest
实现,但它们似乎没有类似的WebClient。
有什么方法可以使用WebClient
的袜子代理吗?特别是它提供的DownloadString
方法?使用WebClient和袜子代理
我不想使用任何第三方的东西,如privoxy,freecap什么,我不能使用像Chilkat那样的商业库。我尝试使用http://www.mentalis.org/的东西,实际上我使用了他们的WebRequest
实现,但它们似乎没有类似的WebClient。
SOCKS不被WebRequest
/WebResponse
类和扩展直接支持,在WebClient类(它依赖于WebRequest
做的工作)。
这真的不能,因为它工作在传输层(TCP/IP),而不是通过简单的重定向到HTTP请求转发(这就是WebRequest
/WebResponse
类工作的级别)的服务器。
您可以创建一个specialized derivation of WebRequest
/WebResponse
(使用ProxySocket
处理低级别的握手,然后),然后创建一个专门WebClient
class将覆盖GetWebRequest
和GetWebResponse
方法。
一旦您将该类替换为您的WebClient
实例,它应该像正常一样工作(您可能必须在每种情况下都使用它来设置代理)。
这里是我终于实现了,谢谢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。它似乎不是在博客中实现,而不是在文件,我从那里得到
我碰到这个藏汉,发现漂亮的BetterHttpClient
从WebClient的派生,并允许您指定一个socks代理:
BetterHttpClient.HttpClient client = new BetterHttpClient.HttpClient(new BetterHttpClient.Proxy("IP address", port, BetterHttpClient.ProxyTypeEnum.Socks));
这不是一个答案。你应该已经评论过他的答案。但你是对的。他的回答不应该被认为是不完整的。 – C4u