2009-06-04 19 views
39

¿Cómo puedo configurar el proxy HTTP mediante programación, en un cliente WCF, sin usar el proxy predeterminado?¿Cómo puedo establecer un HTTP Proxy (WebProxy) en un proxy de servicio WCF del lado del cliente?

Proxies, proxies, proxies.

De acuerdo con el modelo de desarrollo 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 actualizo una instancia de esa clase y me puedo conectar con el 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 va más de http. Ahora, supongamos que quiero conectar el cliente al servicio web a través de un proxy HTTP (modelado por un System.Net.WebProxy en .NET BCL). Sé de mi extensa y encantadora experiencia leyendo documentación de .NET y WCF, que el tiempo de ejecución de WCF, si no se indica lo contrario, utilizará el proxy de sistema predeterminado cuando se comunique a través de http/https.

que puede establecer que a partir de la línea de comandos en WinXP/2003 with ProxyCfg.exe as described here, y en posteriores versiones de Windows with netsh.exe as described here.

También puedo especificar el proxy web predeterminado para usar dentro de la aplicación configurando System.Net.WebRequest.DefaultWebProxy property.

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 hay un proxy de todo el sistema, pero tengo que utilizar 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, que 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 generado 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?

relacionadas:
- how-to-set-proxy-with-credentials-to-generated-wcf-client

Respuesta

21

La configuración de proxy son parte de la configuración de enlace. Por ejemplo, consulte la propiedad ProxyAddress de los elementos de configuración/clases 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í.

42

Tiene sentido que no haya 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 de código para un cliente WCF, hacer 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 de punto final - donde para llegar al servidor - en el código, que haría algo como esto:

var e = svc.Endpoint; 
e.Address = new System.ServiceModel.EndpointAddress(
    "http://remoteserver:5555/WcfXmlElement"); 
+0

+1 para la fundición como BasicHttpBinding – Lijo

17

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.

Intenté construirlo a través de un UriBuilder, que daría salida a la dirección proxy como "http://username:[email protected]/". Desafortunadamente, el proxy particular que estaba usando no funcionaba con esta técnica.

Lo que encontré después de una amplia búsqueda en Google, es que puede 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; 
+5

Sí. Por supuesto, si hace esto, debe establecer UseDefaultWebProxy = true. Creo que también hay una forma de hacerlo en una base vinculante por cliente. Si b es System.ServiceModel.BasicHttpBinding, necesitaría establecer b.Security.Transport.ProxyCredentialType según lo requiera su proxy. La enumeración es HttpProxyCredentialType y los valores posibles son {Ninguno, Básico, Resumen, Ntlm, Windows}. Ver esta publicación para una pista: http://kennyw.com/indigo/106 – Cheeso

+0

Gracias por el enlace Cheeso. Voy a darle un giro cuando regrese a la oficina en Moday :) –

+0

Esto es lo que quiero, pero no quiero configurar credenciales de forma programática o en algún archivo de configuración. La aplicación de mi cliente necesita detectar automáticamente la dirección proxy y el puerto, las credenciales del usuario (y el dominio si es necesario). Ahora mismo funciona parcialmente del modo que quiero si el proxy no requiere autenticación. La dirección proxy se detecta desde la configuración de red de Windows automáticamente. ¿Cómo puedo obtener credenciales para trabajar de la misma manera? No quiero solicitar al usuario (nuevamente) la contraseña. –

2

También puede probar esto:

programación conseguir cualquier unión que está utilizando, y luego configurar el proxy en él directamente, por ejemplo,

var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService"); 
binding.ProxyAddress = new Uri("http://192.168.5.1:3128"); 

donde "WSDualHttpBinding_IMainService" es el nombre de su unión a partir de su archivo de configuración. También debe configurar UseDefaultWebProxy=false; de lo contrario, su proxy será ignorado.

Cuestiones relacionadas