2010-01-25 27 views
8

Estoy trabajando en una aplicación .NET que llama a servicios web de terceros a través de Internet. Los servicios no usan SOAP, por lo que construimos manualmente un documento de solicitud XML, lo enviamos al servicio a través de HTTP y recuperamos una respuesta XML.Error de autenticación de proxy HTTP 407 al llamar a un servicio web

Nuestro código es un servicio de Windows que se ejecuta en el contexto de una cuenta de dominio de Windows normal, y se sienta detrás de un servidor proxy (Microsoft ISA Server) configurado para requerir autenticación NTLM. La cuenta que ejecuta nuestro servicio tiene permiso para acceder a Internet a través del servidor proxy.

El código es el siguiente:

// Create the request object. 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "POST"; 

// Configure for authenticating proxy server requiring Windows domain credentials. 
request.Proxy = New WebProxy(proxyAddress) { UseDefaultCredentials = true }; 

// Set other required headers. 
request.Accept = acceptableMimeType; 
request.Headers.Add(HttpRequestHeader.AcceptCharset, acceptableCharset); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb"); 
request.Headers.Add(HttpRequestHeader.CacheControl, "no-store"); 
request.Headers.Add(HttpRequestHeader.ContentEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.ContentLanguage, "en-gb"); 
request.ContentType = requestMimeType; 
request.ContentLength = requestBytes.Length; 

// Make the method call. 
using(Stream stream = request.GetRequestStream()) { 
    stream.Write(requestBytes, 0, requestBytes.Length); 
} 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

// Extract the data from the response without relying on the HTTP Content-Length header 
// (we cannot trust all providers to set it correctly). 
const int bufferSize = 1024 * 64; 
List<byte> responseBytes = new List<byte>(); 
using(Stream stream = new BufferedStream(response.GetResponseStream(), bufferSize)) { 
    int value; 
    while((value = stream.ReadByte()) != -1) { 
     responseBytes.Add((byte) value); 
    } 
} 

Esto funciona bien si el servidor proxy está apagado, o la URL ha sido la lista blanca que no requiere autenticación, pero tan pronto como la autenticación está activo, siempre falla con un error HTTP 407

Pongo el código anterior en un arnés de prueba, e intenté todos los métodos que pude pensar para configurar la propiedad request.Proxy, sin éxito.

Me di cuenta de que todos los servicios web de terceros a los que tenemos que llamar son HTTPS. Cuando intenté acceder a ellos como HTTP, la autenticación proxy comenzó a funcionar. ¿Hay algún aro adicional que deba atravesar para obtener autenticación de proxy y HTTPS para jugar bien?

PD: Los mismos problemas ocurren con el servidor proxy SmoothWall de fuente abierta, por lo que no puedo simplemente escribirlo como un error en el servidor ISA.

PPS: Soy consciente de que puede configurar los parámetros del proxy en app.config, pero (a) hacerlo en el código no debería hacer ninguna diferencia, y (b) el diseño de la aplicación requiere que leamos la configuración del proxy de un base de datos en tiempo de ejecución.

Respuesta

2

Creo que tendré que escribir esta pregunta. Mi código original publicado parece funcionar a veces. Nuestro servidor proxy es extremadamente poco confiable; un minuto bloqueará una conexión a Internet desde cualquier software, y el siguiente lo permitirá. Los técnicos de TI parecen impotentes para hacer algo al respecto, y nosotros (todos fuera del departamento de TI) no tenemos autoridad para realizar cambios en la infraestructura de la red.

Si alguien tiene alguna idea sobre cómo "endurecer" mi código para compensar un servidor proxy no confiable, entonces estaría interesado en escucharlos. :-)

+0

eso es exactamente lo que ocurre en mi caso. Algunas veces me he podido conectar sin este error. –

+3

Publicar como una sugerencia para la solución de problemas para aquellos que se pasean por esto: podría ser la configuración/software del servidor proxy, pero el primer control en problemas intermitentes como este es eliminar la falla parcial del clúster. Si hay varios servidores proxy detrás de un equilibrador de carga, y solo uno está configurado correctamente, solo se procesará cuando se equilibre con la instancia "buena", es decir, también. a veces. – Barryrowe

9

¿Ha intentado configurar el proxy en la aplicación.config?

Para desactivar el proxy, en el archivo app.config añadir la siguiente configuración

<system.net> 
    <defaultProxy enabled="false" useDefaultCredentials="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 

Para habilitar el proxy y utilizar la configuración de proxy predeterminado (especificado en IE) añadir esta configuración en el App.config

<system.net> 
    <defaultProxy enabled="true" useDefaultCredentials="true"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 
+1

Lo he intentado, y obtuve los mismos resultados. Funciona bien para direcciones HTTP, pero falla para HTTPS. –

0

¿Hay algún problema con el certificado del servidor proxy? Si su servicio no puede establecer HTTPS, arrojará un error.

+0

He preguntado a nuestros administradores de TI sobre esto, y dicen que definitivamente está configurado para admitir SSL. Navegaron con éxito a un sitio web HTTPS a través del servidor proxy. –

3

tuve una situación similar

Did notado que funcionaba cuando se conectaba a Internet antes de ejecutar el código? y si no había accedido a Internet durante años (20 minutos para mí), recibió el error.

¿Ha intentado establecer las credenciales de proxy directamente?

//setup the proxy 
request.Proxy = new WebProxy("proxyIp", 8080); 
request.Proxy.Credentials = CredentialCache.DefaultCredentials; 

Recientemente blogged acerca de esto.

¡Espero que esto solucione tu problema también!

+0

¡Hola, Dbones, gracias por compartir tu experiencia! Desafortunadamente, he observado que el servidor proxy falla repentinamente incluso después de que las conexiones exitosas se realizaron solo unos segundos antes. También he probado ese método exacto para definir el proxy en el código, y no hizo ninguna diferencia. –

+0

wow, odio decirlo, pero lo anterior solucionó mi problema. Espero que puedas encontrar una resolución para tu situación – dbones

Cuestiones relacionadas