¿Cómo puedo establecer un Proxy HTTP(WebProxy) en un proxy de servicio WCF del lado del cliente?
(4)
La configuración del proxy es parte de la configuración de enlace. Por ejemplo, mire la propiedad ProxyAddress de las clases / elementos de configuración BasicHTTPBinding y WSHttpBinding .
Parece que está dejando su configuración de punto final en el archivo app.config, en cuyo caso debería poder establecer la dirección allí.
¿Cómo puedo configurar el proxy HTTP mediante programación, en un cliente WCF, sin utilizar el proxy predeterminado?
Proxies, proxies, proxies.
De acuerdo con el modelo de desarrollo de WCF, genero clases de "proxy" del lado del cliente ejecutando svcutil.exe en el WSDL para el servicio. (Esto también produce un archivo de configuración del lado del cliente).
En mi código, renuevo una instancia de esa clase y me puedo conectar al servicio. Muy agradable.
var svcProxy = new MyWebService();
svcProxy.GetInformation(request);
Llamamos a esto una clase proxy, pero hay otro proxy: el proxy http. Este servicio está utilizando wsHttpBinding basicHttpBinding, por lo que está revisando http. Ahora, supongamos que quiero conectar el cliente al servicio web a través de un proxy http (modelado por System.Net.WebProxy en .NET BCL). Sé por mi extensa y deliciosa experiencia leyendo la documentación de .NET y WCF, que el tiempo de ejecución de WCF, si no se indica lo contrario, utilizará el proxy del sistema predeterminado cuando se comunique a través de http / https.
Puedo configurarlo desde la línea de comandos en WinXP / 2003 con ProxyCfg.exe como se describe aquí , y en las versiones posteriores de Windows con netsh.exe como se describe aquí .
También puedo especificar el proxy web predeterminado para usar dentro de la aplicación estableciendo la propiedad System.Net.WebRequest.DefaultWebProxy .
Pero supongamos que quiero conectarme a través de un proxy que es diferente al proxy de todo el sistema. Por ejemplo, tal vez no haya un proxy para todo el sistema, pero necesito usar uno para el servicio web en particular. O tal vez haya un proxy para todo el sistema, pero necesito usar uno diferente para el servicio web. Y, de hecho, tal vez haya múltiples clientes de servicios web, y cada uno debería obtener un proxy diferente.
¿Cómo se puede establecer el proxy por enlace?
En el modelo ASMX, podría hacer esto:
var svcProxy = new MyWebService();
svcProxy.Proxy = new System.Net.WebProxy("http://proxyserver:1234", true);
svcProxy.GetInformation(request);
Pero esto no es posible con WCF; las clases de proxy del lado del cliente generadas por WCF no exponen una propiedad Proxy. ¿Cómo configuro el proxy HTTP, por proxy del lado del cliente, y cómo configuro la autenticación en el proxy HTTP también?
Relacionado:
- how-to-set-proxy-with-credentials-to-generated-wcf-client
También puedes probar esto:
Obtenga programáticamente cualquier enlace que esté utilizando, y luego configure el proxy directamente en él, p. Ej.
var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");
donde "WSDualHttpBinding_IMainService"
es el nombre de su enlace desde su archivo de configuración. También debe establecer UseDefaultWebProxy=false
; de lo contrario, su proxy será ignorado.
Tiene sentido que no haya una propiedad Proxy en el proxy WCF, porque no todos los proxies WCF usan HTTP para la comunicación. Después de una revisión más profunda, descubrí que es posible configurar el proxy en WCF mediante programación, si el proxy WCF utiliza un enlace HTTP. Lo estoy documentando aquí en caso de que alguien más lo necesite. Para configurar el Proxy HTTP en el código para un cliente WCF, haga esto:
// instantiate a proxy for the service
var svc= new ServiceClient();
// get the HTTP binding
var b = svc.Endpoint.Binding as System.ServiceModel.BasicHttpBinding;
b.ProxyAddress = new Uri("http://127.0.0.1:8888");
b.BypassProxyOnLocal = false;
b.UseDefaultWebProxy = false;
Y para establecer la dirección del punto final - dónde llegar al servidor - en el código, harías algo como esto:
var e = svc.Endpoint;
e.Address = new System.ServiceModel.EndpointAddress(
"http://remoteserver:5555/WcfXmlElement");
Tuve un problema similar, pero también necesitaba usar un nombre de usuario y una contraseña para el proxy que difieran del nombre de usuario y la contraseña utilizados para acceder al servicio.
Traté de compilarlo a través de un UriBuilder, que daría salida a la dirección proxy como " http://username:password@myproxyserver/ ". Desafortunadamente, el proxy particular que estaba usando no funcionaba con esta técnica.
Lo que encontré después de una extensa búsqueda en Google, es que puedes cambiar el proxy a través de WebRequest.DefaultProxy (propiedad estática).
Por ejemplo:
WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;