2009-05-03 46 views
28

Estoy usando una clase de cliente web en mi código fuente para descargar una cadena usando http.C# webclient y servidor proxy

Esto funcionaba bien. Sin embargo, los clientes de la empresa están ahora conectados a un servidor proxy. Y el problema comenzó a partir de esto.

Cuando he probado mi aplicación, no creo que pueda pasar por el servidor proxy, ya que la excepción que sigue lanzándose es "no hay respuesta de xxx.xxx.xxx.xxx" que es la dirección IP del servidor proxy.

sin embargo, todavía puede navegar a la URL del sitio web y se muestra la cadena correctamente en el navegador cuando se conecta a través de un servidor proxy, pero no cuando uso el cliente web.

¿hay algo en la web cliente que tengo que configurar para que pueda acceder a la URL desde detrás de un servidor proxy?

using (WebClient wc = new WebClient()) 
{ 
    string strURL = "http://xxxxxxxxxxxxxxxxxxxxxxxx"; 

    //Download only when the webclient is not busy. 
    if (!wc.IsBusy) 
    { 
     string rtn_msg = string.Empty; 
     try 
     { 
      rtn_msg = wc.DownloadString(new Uri(strURL)); 
      return rtn_msg; 
     } 
     catch (WebException ex) 
     { 
      Console.Write(ex.Message); 
      return false; 
     } 
     catch (Exception ex) 
     { 
      Console.Write(ex.Message); 
      return false; 
     } 
    } 
    else 
    { 
     System.Windows.Forms.MessageBox.Show("Busy please try again"); 
     return false; 
    } 
} 

Respuesta

33

Mi solución:

WebClient client = new WebClient(); 
WebProxy wp = new WebProxy(" proxy server url here"); 
client.Proxy = wp; 
string str = client.DownloadString("http://www.google.com"); 
+3

Idealmente, cliente Web también debería estar en una instrucción using ya que implementa IDisposable. Poste útil sin embargo. – Orphid

+1

Para ser más claro que Orphid; con el código anterior (que es perfectamente legítimo) no olvides llamar '.Dispose' en el webclient. Además, WebProxy tiene una sobrecarga de constructor que toma un número de puerto como segundo argumento – user3791372

7

que he encontrado el mismo problema, pero utilizando un webclient para descargar un archivo de Internet con una Aplicación de Winform que la solución estaba agregando en la aplicación .config:

<system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
</system.net> 

La misma solución funcionará para una aplicación asp.net insertando las mismas filas en web.config.

Espero que ayude.

6

La respuesta propuesta por Jonathan es correcta, pero requiere que especifique las credenciales de proxy y la url en el código. Por lo general, es mejor permitir el uso de las credenciales como configuración en el sistema de forma predeterminada (los usuarios suelen configurar la configuración LAN de todos modos en caso de que usen un proxy) ...

La respuesta a continuación ha sido proporcionada por Davide en una respuesta anterior , pero eso requiere modificar los archivos app.config. Esta solución es probablemente más útil ya que hace lo mismo EN CÓDIGO.

Con el fin de permitir que la aplicación utiliza la configuración de proxy por defecto que se utiliza en el sistema del usuario, se puede utilizar el siguiente código:

IWebProxy wp = WebRequest.DefaultWebProxy; 
wp.Credentials = CredentialCache.DefaultCredentials; 
wc.Proxy = wp; 

Esto permitirá que el código de la aplicación para utilizar el proxy (con iniciada una sesión en credenciales y configuraciones predeterminadas de url de proxy) ... ¡No hay dolores de cabeza! :)

Espero que esto ayude a los futuros televidentes de esta página a resolver su problema.

+1

¿Cómo es que no tengo que hacer esto cuando ejecuto Fiddler (cliente proxy local)? Todas las llamadas se canalizan a través de fiddler cuando se usa WebClient, incluso sin configuración del proxy. – Nilzor

14

Si necesita autenticar al proxy, debe establecer UseDefaultCredentials en false y configurar el proxy Credentials.

WebProxy proxy = new WebProxy(); 
proxy.Address = new Uri("mywebproxyserver.com"); 
proxy.Credentials = new NetworkCredential("usernameHere", "pa****rdHere"); //These can be replaced by user input 
proxy.UseDefaultCredentials = false; 
proxy.BypassProxyOnLocal = false; //still use the proxy for local addresses 

WebClient client = new WebClient(); 
client.Proxy = proxy; 

string doc = client.DownloadString("http://www.google.com/"); 

Si todo lo que necesita es un simple proxy, omita la mayoría de las líneas anteriores.Todo lo que necesita es:

WebProxy proxy = new WebProxy("mywebproxyserver.com"); 
2
 

    byte[] data; 
       using (WebClient client = new WebClient()) 
       { 
        ICredentials cred; 
        cred = new NetworkCredential("[email protected]", "mybestpassword"); 
        client.Proxy = new WebProxy("192.168.0.1",8000); 
        client.Credentials = cred; 
        string myurl="http://mytestsite.com/source.jpg"; 
        data = client.DownloadData(myUrl); 
       } 

      File.WriteAllBytes(@"c:\images\target.jpg", data); 

Cuestiones relacionadas