2009-05-13 30 views
7

Necesito agregar una funcionalidad en una aplicación (C#) que utilizará un servicio web (servicio XML SOAP).Llamar a un servicio web desde detrás de un servidor proxy

Ahora esta aplicación puede (y sobre todo) usarse en un entorno corporativo que tenga un servidor proxy en su lugar.

Entiendo que los servicios SOAP usan el protocolo HTTP y, por lo tanto, deben usar el puerto 80, que normalmente se mantiene abierto. ¿Es correcto que la aplicación pueda usar el servicio web sin una codificación especial o tendré que escribir un código especial para detectar la configuración del proxy o algún otro problema que vea?

EDITAR: El servicio web es un servicio público disponible en Internet. No está en la misma red.

Respuesta

6

DE ACUERDO. Así que hice algunos experimentos y resulta que necesitamos escribir algún código para hacerlo funcionar desde detrás del servidor proxy. (Aunque yo hubiera preferido una mejor solución)

lo que en realidad profundiza hasta llegar a pedir detalles del servidor proxy de usuario y luego configurar la clase de servicio de proxy para el servidor proxy de la siguiente manera:

 
var networkCredentials = new NetworkCredential ("username", "password", "domain"); 
WebProxy myProxy = new WebProxy ("W.X.Y.Z:NN", true) {Credentials = networkCredentials}; 
var service = new iptocountry { Proxy = myProxy }; 
string result = service.FindCountryAsString ("A.B.C.D"); 

escribí una prueba clase y utiliza IP To Country servicio web gratuito.

Usando el código anterior, podría consumir el servicio web con éxito.

+1

¿No pudo hacer lo anterior en el elemento de configuración ? –

+0

Intenté usar el código (aunque no el archivo de configuración), pero no funcionó. En realidad, la aplicación que tenía la intención de consumir este servicio es una aplicación de Windows. No estoy seguro de si importa o no. – Hemant

-1

Si su servicio web está en la misma red interna que el cliente que llama al servicio web, entonces no debería pasar por un proxy.

+0

Nº servicio web es un servicio disponible públicamente en Internet. No está en la misma red. – Hemant

-1

Mientras se permita el tráfico web (puerto 80), no debería necesitar hacer nada especial. Desde la perspectiva de un enrutador/servidor proxy, las llamadas al servicio web son las mismas que cualquier otro tráfico HTTP.

10

Utilizará el puerto 80 de manera predeterminada, y no debería tener que hacer ninguna codificación adicional.

Si necesita ir a través de un proxy de algún tipo, todo lo que tiene que hacer es añadir lo siguiente a su web.config:

<system.net> 
    <defaultProxy> 
     <proxy proxyaddress="http://yourproxyserver:80" /> 
    </defaultProxy> 
    </system.net> 

También puede hacerlo a través de este código usando:

WebRequest.DefaultWebProxy = new WebProxy("http://yourproxyserver:80/",true); 
5

El código incorporado (WebClient, WCF, HttpWebRequest, etc.) hace uso de la configuración de WinHTTP para obtener la configuración de proxy. ¡Entonces todo lo que necesita hacer es configurar WinHTTP para conocer el proxy!

En XP, esto es:

proxycfg -u 

, importador de los ajustes de configuración del proxy de IE del usuario (WinInet).

En Vista/etc, se utiliza

netsh winhttp 

(y algunos subcomando como "importación")

no probado, pero trate:

netsh winhttp import proxy source=ie 

Después de eso, su código .NET todos deberían funcionar a través del proxy que los usos supuestamente ya se han configurado para usar IE etc.

+1

¿Es posible hacer lo anterior a través del código? La razón es que la aplicación que necesitará acceder al servicio web es una aplicación de formulario de Windows y puede ejecutarse en una serie de computadoras. No es factible pedirles a los usuarios que tomen los pasos anteriores. – Hemant

7

Puede utilizar la configuración por defecto de que la máquina local:

System.Net.ServicePointManager.Expect100Continue = false; 
wsclient.Proxy= System.Net.HttpWebRequest.GetSystemWebProxy(); 
wsclient.Proxy.Credentials = CredentialCache.DefaultCredentials;  

y en app.config añadir esta configuración:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <settings> 
     <servicePointManager expect100Continue="false" /> 
    </settings> 
    </system.net> 
</configuration> 
Cuestiones relacionadas