net - state pattern c#
C#Conectando a través de Proxy (10)
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?
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 un 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;
Este código me ha funcionado:
WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;
Este one-liner funciona para mí:
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
CredentialCache.DefaultNetWorkCredentials
es la configuración de proxy establecida en Internet Explorer.
WebRequest.DefaultWebProxy.Credentials
se usa para toda la conectividad de Internet en la aplicación.
Esto se logra fácilmente mediante programación, en su código o declarativamente en web.config o app.config.
Puede crear un proxy de forma programática como ese:
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á asignando el objeto WebProxy
a la propiedad proxy
del objeto de request
. Esta request
usará el proxy
que 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 usarán todas las solicitudes http. Dependiendo exactamente de 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.
La detección automática de proxy es un proceso mediante el cual un servidor proxy web es identificado por el sistema y se utiliza para enviar solicitudes en nombre del cliente. Esta función también se conoce como Autodescubrimiento automático de proxy web (WPAD). Cuando la detección automática de proxy está habilitada, el sistema intenta ubicar una secuencia de comandos de configuración de proxy que es responsable de devolver el conjunto de proxies que se pueden usar para la solicitud.
Prueba 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 use proxy.Credentials = ....
porque mi servidor proxy es un servidor de aceleración de Internet autenticado 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);
}
}
Si desea que la aplicación use 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
Si está usando WebClient
, tiene una propiedad Proxy que puede usar.
Como otros han mencionado, hay varias maneras 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 cofigurar la configuración de 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();
Voy a usar un ejemplo para agregar a las respuestas anteriores.
Me encontré con problemas de proxy al intentar instalar paquetes a través de Web Platform Installer
Eso también usa un archivo de configuración que es WebPlatformInstaller.exe.config
Intenté las modificaciones 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.
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);