Error de autenticación del proxy HTTP 407 al llamar a un servicio web

Estoy trabajando en una aplicación .NET que llama a servicios web de terceros a través de Internet. Los servicios no utilizan 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.

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

El código se ve así:

// 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 si la URL se ha incluido en la lista blanca y no requiere autenticación, pero tan pronto como la autenticación está activa, siempre falla con un error HTTP 407.

Puse el código anterior en un arnés de prueba y probé todos los métodos que pude encontrar para configurar elrequest.Proxy Propiedad, sin éxito.

Entonces 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 por el que tengo que saltar para obtener la autenticación proxy y HTTPS para jugar bien?

PD: Los mismos problemas ocurren con el servidor proxy SmoothWall de código abierto, por lo que no puedo descartarlo como un error en el servidor ISA.

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta