2009-12-21 23 views
73

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 provista por proxy? ¿Cómo puedo hacer cualquier tipo de conexión a través de un proxy?C# Conectando a través de Proxy

Respuesta

83

Esto se logra fácilmente ya sea programáticamente, en su código o declarativamente en el web.config o el app.config.

Se pueden crear mediante programación un proxy de este modo:

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, se está asignando el objeto WebProxy a la propiedad del objeto requestproxy. Este request usará entonces el proxy que defina.

Para lograr lo mismo mediante declaración, 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 usarán todas las solicitudes http. Dependiendo de exactamente lo que necesite lograr, puede o no requerir algunos de los atributos adicionales del elemento defaultProxy/proxy, por lo tanto, consulte la documentación correspondiente.

+0

en el ejemplo programático, no configuró el puerto, ¿POR QUÉ? – Skuta

+0

@Skuta: sin motivo en particular. Eso fue simplemente un descuido, como en ese ejemplo, estoy usando el constructor que toma la URL (como una cadena) y un booleano para determinar si las direcciones locales se pasan por alto. Si necesita un número de puerto específico, podría ser mejor utilizar el constructor sobrecargado que permite la URL (como una cadena) y el número de puerto (como un Int32), luego establecer la propiedad 'BypassProxyOnLocal' en True (si es necesario) inmediatamente después. – CraigTP

+2

@Skuta - He editado mi publicación para aclarar esto y para asegurarme de que los ejemplos programáticos y declarativos están realmente haciendo lo mismo. – CraigTP

20

Si está usando WebClient, tiene una propiedad Proxy que puede usar.

como han mencionado otros, hay varias maneras de automatizar la configuración de detección/uso

Web.Config Proxy:

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

uso de la clase WebProxy como se describe en this article.


También puede cofigurar 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(); 
5

Si desea que la aplicación para utilizar el proxy por defecto del sistema, añadir esto a su Application.exe.config (donde aplicación.exe es el nombre de su aplicación):

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

Más detalles se pueden encontrar en MSDN article on System.Net

0

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

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

+3

¿Cómo responde esto la pregunta? ¿Cómo puede el OP poner esta información en uso? – Cullub

3

Este código ha trabajado para mí:

WebClient wc = new WebClient(); 
wc.Proxy.Credentials = CredentialCache.DefaultCredentials; 
6

probar este código. Llámalo antes de realizar cualquier solicitud http. El código usará el proxy de su configuración de Internet Explorer. Sin embargo, una cosa es que utilizo proxy.Credentials = .... porque mi servidor proxy es un servidor de aceleración de Internet autenticado por NTLM. Dale un genio.

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); 
    } 
} 
+2

'WebProxy.GetDefaultProxy' es obsoleto desde Framework 4.5 y este método devuelve null. Mejor pensar 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 será de ayuda. – cassandrad

4

código de Foole funcionó a la perfección para mí, pero en .NET 4.0, no se olvide de comprobar si Proxy es NULL, que significa que no hay proxy configurado (fuera de entorno corporativo)

Así que aquí está el código que resuelto mi problema con la representación corporativa

WebClient web = new WebClient(); 
if (web.Proxy != null) 
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
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); 
+3

Es preferible escribir una explicación de su solución y no solo el código postal. ¿Puedes editar en algún texto que pueda ayudar al lector? –

0

voy a utilizar un ejemplo para añadir a las respuestas anteriores.

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

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

probé las ediciones sugieren en this IIS forum 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 es necesario estar registrado en la plataforma Web de instalación con el fin de usarlo.

3

Esta sola línea funciona para mí:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

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

WebRequest.DefaultWebProxy.Credentials se utiliza para todas las conexiones a Internet de la aplicación.

Cuestiones relacionadas