2012-10-29 11 views
15

Czy istnieje sposób na użycie proxy skarpetki z WebClient? W szczególności z dostarczoną metodą DownloadString?Użyj WebClient z proxy skarpet

Nie chcę używać żadnych materiałów stron trzecich, takich jak privoxy, freecap i nie mogę używać komercyjnych bibliotek, takich jak te z Chilkat. Próbowałem używać rzeczy z http://www.mentalis.org/ w rzeczywistości użyłem ich implementacji WebRequest, ale nie wydają się mieć coś podobnego do WebClient.

Odpowiedz

14

SOCKS nie jest obsługiwana bezpośrednio przez WebRequest/WebResponse klas i co za tym idzie, klasa WebClient (opiera się na WebRequest zrobić swoją pracę).

To naprawdę nie może, jak to działa na warstwie transportowej (TCP/IP), a nie za pomocą prostego przekierowania do serwera, który przekazuje żądania HTTP (który to poziom, że WebRequest/WebResponse klas pracować).

można utworzyć specialized derivation of WebRequest/WebResponse (który wykorzystuje ProxySocket obsłużyć potwierdzeń niskiego poziomu do czasu), a następnie utworzyć specjalistycznego WebClient class które zastępują metody GetWebRequest i GetWebResponse.

Gdy ta klasa zostanie zastąpiona instancjami WebClient, powinna działać normalnie (konieczne może być skonfigurowanie serwera proxy w każdym przypadku, w którym go używasz).

-2

Oto jak skończyło się to robić, dziękuję casperOne na odpowiedź

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; 
    } 
} 

szukam tego samego kodu, ale to nie robi naprawdę pracować dla mnie. Zastanawiam się, gdzie masz IProxyDetails -Object. To nie wydaje się być wdrożone w blogu, a nie w plikach mam stamtąd

+0

To nie jest odpowiedź. Powinieneś to skomentować do swojej odpowiedzi. Ale masz rację. Jego odpowiedź nie powinna być tak mocno potraktowana, jak jej niekompletność. – C4u

1

natknąłem tym również i znalazł piękny BetterHttpClient

Wywodzi się z WebClient i pozwala określić proxy SOCKS:

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