Conexión de C # a través de proxy

93

Trabajo en una oficina que requiere que todas las conexiones se realicen a través de un proxy http específico. Necesito escribir una aplicación simple para consultar algunos valores de un servidor web; es fácil si no hubiera un proxy. ¿Cómo puedo hacer que la aplicación C # sea compatible con el proxy? ¿Cómo puedo realizar algún tipo de conexión a través de un proxy?

KalEl
fuente

Respuestas:

105

Esto se logra fácilmente, ya sea mediante programación, en su código, o declarativamente en web.config o app.config.

Puede crear un proxy mediante programación así:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

Básicamente, estás asignando el WebProxyobjeto a la propiedad requestdel objeto proxy. Esto requestluego usará el proxyque defina.

Para lograr lo mismo declarativamente, puede hacer lo siguiente:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[your proxy address and port number]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

dentro de su web.config o app.config. Esto establece un proxy predeterminado que utilizarán todas las solicitudes http. Dependiendo exactamente de lo que necesite lograr, es posible que necesite o no algunos de los atributos adicionales del elemento defaultProxy / proxy , así que consulte la documentación para estos.

CraigTP
fuente
en el ejemplo programático, no configuró el puerto, ¿POR QUÉ?
Skuta
@Skuta - No hay ninguna razón en particular. Eso fue simplemente un descuido, ya que en ese ejemplo, estoy usando el constructor que toma la URL (como una cadena) y un booleano para determinar si se omiten las direcciones locales. Si necesita un número de puerto específico, podría ser mejor usar el constructor sobrecargado que permite la URL (como una cadena) y el número de puerto (como un Int32), luego establezca la BypassProxyOnLocalpropiedad en True (si es necesario) inmediatamente después.
CraigTP
2
@Skuta - ¡He editado mi publicación para aclarar esto y asegurarme de que los ejemplos programáticos y declarativos estén haciendo lo mismo!
CraigTP
23

Si lo está utilizando WebClient, tiene una propiedad Proxy que puede utilizar.

Como otros han mencionado, hay varias formas de automatizar la detección / uso de la configuración del proxy

Web.Config:

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
     <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

Uso de la clase WebProxy como se describe en este artículo .


También puede configurar la configuración del proxy directamente (configuración o código) y su aplicación los usará.

Web.Config:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[proxy address]:[proxy port]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

Código:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
WebProxy myproxy = new WebProxy("[proxy address]:[proxy port]", false);
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
Oded
fuente
7

Prueba este código. Llámelo antes de realizar cualquier solicitud http. El código usará el proxy de la configuración de Internet Explorer; sin embargo, una cosa la uso proxy.Credentials = ....porque mi servidor proxy es un servidor de aceleración de Internet autenticado por NTLM. Dale un toque.

static void setProxy()
{
    WebProxy proxy = (WebProxy)WebProxy.GetDefaultProxy();
    if(proxy.Address != null)
    {
        proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        WebRequest.DefaultWebProxy = new System.Net.WebProxy(proxy.Address, proxy.BypassProxyOnLocal, proxy.BypassList, proxy.Credentials);
    }
}
Seamus
fuente
3
WebProxy.GetDefaultProxyestá obsoleto desde Framework 4.5 y este método devuelve nulo. Mejor piensa antes de usar CredentialCache.DefaultNetworkCredentials. Si ha puesto algo en CredentialCache y su proxy requiere tales credenciales, entonces debería funcionar. De lo contrario, no ayudará.
cassandrad
6

Si desea que la aplicación utilice el proxy predeterminado del sistema, agréguelo a su Application.exe.config (donde application.exe es el nombre de su aplicación):

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
   <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

Se pueden encontrar más detalles en el artículo de MSDN en System.Net

Robert Christie
fuente
Nota: La sección: <system.net> va dentro de la sección <configuration> o el archivo exe.config. Esto hizo que las cosas del proxy funcionaran en una aplicación de consola simple que preparé.
John Dyer
5

Esta frase me funciona:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials es la configuración de proxy establecida en Internet Explorer.

WebRequest.DefaultWebProxy.Credentials se utiliza para toda la conectividad a Internet en la aplicación.

Coert Grobbelaar
fuente
1
"CredentialCache.DefaultNetWorkCredentials es la configuración de proxy establecida en Internet Explorer". ¿Sigue siendo así? No puedo encontrar ningún lugar en Opciones de Internet> Conexiones> Configuración de LAN para escribir un nombre de usuario y contraseña.
Matt
De los documentos: "Para una aplicación del lado del cliente, estas suelen ser las credenciales de Windows (nombre de usuario, contraseña y dominio) del usuario que ejecuta la aplicación".
Coert Grobbelaar
Esta respuesta puede haber envejecido un poco mal, pero estoy bastante seguro de que fue cierto para las ventanas de 2015
Coert Grobbelaar
4

El código de Foole funcionó perfectamente para mí, pero en .NET 4.0, no olvide verificar si Proxy es NULL, lo que significa que no hay proxy configurado (fuera del entorno corporativo)

Así que aquí está el código que resolvió mi problema con nuestro proxy corporativo

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
JCH2k
fuente
3

Este código me ha funcionado:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Tonto
fuente
0

La detección automática de proxy es un proceso mediante el cual el sistema identifica un servidor proxy web y lo utiliza para enviar solicitudes en nombre del cliente. Esta función también se conoce como descubrimiento automático de proxy web (WPAD). Cuando la detección automática de proxy está habilitada, el sistema intenta localizar un script de configuración de proxy que es responsable de devolver el conjunto de proxies que se pueden utilizar para la solicitud.

http://msdn.microsoft.com/en-us/library/fze2ytx2.aspx

Elijah Glover
fuente
4
¿Cómo responde esto a la pregunta? ¿Cómo puede el OP utilizar esta información?
Cullub
0
            var getHtmlWeb = new HtmlWeb() { AutoDetectEncoding = false, OverrideEncoding = Encoding.GetEncoding("iso-8859-2") };

            WebProxy myproxy = new WebProxy("127.0.0.1:8888", false);
            NetworkCredential cred = (NetworkCredential)CredentialCache.DefaultCredentials;
            var document = getHtmlWeb.Load("URL", "GET", myproxy, cred);
JD-V
fuente
5
Es preferible escribir una explicación de su solución y no solo el código postal. ¿Puedes editar en algún texto que ayudaría al lector?
Brian Tompsett - 汤 莱恩
0

Voy a usar un ejemplo para agregar a las respuestas anteriores.

Me encontré con problemas de proxy al intentar instalar paquetes a través del Instalador de plataforma web

Eso también usa un archivo de configuración que es WebPlatformInstaller.exe.config

Probé las ediciones sugeridas en este foro de IIS que es

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.net>    
     <defaultProxy enabled="True" useDefaultCredentials="True"/>      
   </system.net>
</configuration>

y

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
   <system.net>    
     <defaultProxy>      
          <proxy 
               proxyaddress="http://yourproxy.company.com:80" 
               usesystemdefault="True"
               autoDetect="False" />    
     </defaultProxy>  
   </system.net>
</configuration>

Ninguno de estos funcionó.

Lo que funcionó para mí fue esto:

<system.net>    
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="WebPI.Net.AuthenticatedProxy, WebPI.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79a8d77199cbf3bc" />
    </defaultProxy>  
 </system.net>

El módulo necesitaba estar registrado con Web Platform Installer para poder usarlo.

Mukus
fuente