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.
eso es exactamente lo que ocurre en mi caso. Algunas veces me he podido conectar sin este error. –
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