create crear consumir clientbase wcf proxy webclient

crear - wcf soap service c#



Uso de WebClient en WCF Service (3)

Estoy usando WebClient para descargar algunos recursos de la siguiente manera:

Stream stream; try { WebClient webClient = new webClient(); stream = webClient.OpenRead(MyResourceUri); } catch (Exception) { return null; } return stream;

Cuando hago esto en una aplicación WPF, funciona bien y se obtiene la transmisión adecuada.

Cuando hago esto en una llamada de servicio WCF, no funciona. Se lanza una WebException con el mensaje "Unable to connect to remote server" . (Funciona para archivos alojados en mi máquina o dentro de la red de la compañía, pero falla para cualquier recurso en la web). El servicio está alojado en IIS7.

La investigación hasta ahora revela que la diferencia se debe a la webproxy. El webclient.proxy en la aplicación WPF se refiere a la configuración del proxy como se establece en IE, mientras que el de WCF no tiene ninguno.

¿Por que es esto entonces? Y, lo que es más importante, ¿cómo puedo hacer que el WebClient en WCF use una configuración de proxy similar?

EDITAR: Configuré el proxy en WebClient y funcionó en el servicio WCF

webClient.Proxy = new WebProxy(ProxyAddressFromIE);

Aquí he codificado la dirección proxy. ¿Qué método / API hay para obtener uno? ¿Y todavía por qué es diferente en el servicio WCF y en la aplicación WPF?


Considere manejar la llamada usando fuentes distintas del WebClient altamente abstraído. Desde el nivel superior al inferior, esto significa explorar objetos WebRequest y WebResponse hasta la programación del socket. El motivo es que el método WebClient está estrechamente vinculado a las opciones en Internet Explorer, ya que gran parte de la pila de Internet de alto nivel está en Windows. Si quieres evitar esto, necesitas cavar más profundo.

Me encantaría señalar con precisión dónde cavar, pero no he incurrido en este problema en particular y no tengo experiencia resolviendo. Sé dónde buscar la respuesta, pero no hay detalles sobre "X marca el lugar". Sin embargo, debido a la naturaleza altamente abstraída y de alto nivel de WebClient, no estoy seguro de que pueda sortear fácilmente la creación implícita de la pila y / o el acoplamiento con IE, sin más dolores de cabeza que punting y utilizando un objeto que brinde más control de la comunicación HTTP.

Feliz cacería.


Para responder a una de sus preguntas, la razón por la cual existe una diferencia entre su aplicación WPF y su servicio WCF alojado en IIS es esta.

Las aplicaciones WPF se ejecutan en una sesión real de Windows (la sesión de usuario para ser exactos). Esto significa que hay un perfil de usuario cargado para esa sesión y esa sesión contiene, entre otras cosas, la configuración del proxy configurada en IE.

Los servicios WCF alojados en IIS no se ejecutan en una sesión de Windows. Se ejecutan como un servicio y, por lo tanto, no tienen una sesión de Windows (en realidad se ejecutan en la sesión 0, pero eso es solo un detalle de implementación). Esto significa que no hay configuración de proxy.

Para resolverlo de manera confiable, puede tener su propia configuración para un proxy, quizás en web.config. Otra opción es configurar el proxy a través de netsh.exe.


Necesitaba hacer exactamente lo mismo, y encontré la respuesta aquí: obtener el URI del proxy web predeterminado . Básicamente, debe leer dinámicamente el proxy mediante WebRequest.GetSystemWebProxy() y determinar el proxy mediante una url proxied de prueba.

¡Espero que esto ayude!