2009-11-04 31 views
6

Tengo un programa de cliente que consume un servicio web. Funciona bastante bien en varias instalaciones. Ahora tengo una situación en la que un nuevo cliente se conecta a Internet a través de un servidor proxy, y el intento de mi programa de acceder al servicio web obtiene el error "Estado HTTP 407: autenticación proxy requerida".Consumir un servicio web a través de un servidor proxy de Internet, utilizando un cliente WCF en C#; proporcionar autenticación de servidor proxy

Pensé que toda la configuración del acceso a Internet, incluida la dirección del servidor proxy, el número de puerto y la autenticación se realizaría en las Opciones de Internet del Panel de control, y que no tendría que preocuparme por eso en el código, ni siquiera en la aplicación.config, del cliente del servicio web.

¿Lo he entendido mal?

Lo que he hecho en el tiempo medio es dar al usuario la oportunidad de configurar el nombre de usuario y contraseña del proxy, y luego en mi código que haga lo siguiente:

webServiceClient.ClientCredentials.UserName.UserName = configuredUsername; 
webServiceClient.ClientCredentials.UserName.Password = configuredPassword; 

Pero no sé que esto es lo correcto. Porque me parece que los ClientCredentials anteriores se referirían al enlace/seguridad del servicio web, no al servidor proxy de Internet.

Supongo que puedo probarlo en el cliente, pero prefiero estar seguro de lo que estoy haciendo primero.

Respuesta

6

Descubrí cómo hacer esto, con la ayuda de un colaborador de otro foro que en la agitación de probar todo tipo de cosas que he olvidado. Así que gracias a esa persona ahora olvidada.

Aquí está el código que trabajó en el extremo (convenientemente disfrazados, pero da la idea correcta):

BasicHttpBinding binding = new BasicHttpBinding("APISoap"); /* APISoap is the name of the binding element in the app.config */ 
    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic; 
    binding.UseDefaultWebProxy = false; 
    binding.ProxyAddress = new Uri(string.Format("http://{0}:{1}", proxyIpAddress, proxyPort)); 
    EndpointAddress endpoint = new EndpointAddress("http://www.examplewebservice/api.asmx"); 

    WebServiceClient client = new WebServiceClient(binding, endpoint); 

    client.ClientCredentials.UserName.UserName = proxyUserName; 
    client.ClientCredentials.UserName.Password = proxyPassword; 
+2

¿Qué pasa si el servicio web requiere sus propias credenciales, ¿sabe cómo agregarlos junto con el proxy ¿iniciar sesión? –

+0

Esta solución funciona cuando el servicio y el proxy necesitan las mismas credenciales, pero en caso de que ambos requieran credenciales propias, entonces cómo establecer las credenciales. En el caso del proxy autenticado NTLM, ¿qué cambios se deben realizar? – wintersolider

+0

@net_prog y ajay: Lo siento, realmente no puedo responder eso sin hacer una gran cantidad de investigación. Logré hacer que mi solución funcionara hace 5 años atrás y nunca volví a mirar este tipo de cosas desde entonces. – Peter

Cuestiones relacionadas