有什麼方法可以使用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