Błąd uwierzytelniania proxy HTTP 407 podczas wywoływania usługi internetowej

Pracuję nad aplikacją .NET, która wywołuje usługi internetowe innych firm za pośrednictwem Internetu. Usługi nie używają protokołu SOAP, więc ręcznie tworzymy dokument żądania XML, wysyłamy go do usługi za pośrednictwem protokołu HTTP i pobieramy odpowiedź XML.

Nasz kod to usługa systemu Windows, która jest uruchamiana w kontekście zwykłego konta domeny systemu Windows i znajduje się za serwerem proxy (Microsoft ISA Server) skonfigurowanym do uwierzytelniania NTLM. Konto, na którym działa nasz serwis, ma pozwolenie na dostęp do Internetu za pośrednictwem serwera proxy.

Kod wygląda tak:

// 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);
    }
}

Działa to dobrze, jeśli serwer proxy jest wyłączony lub adres URL został umieszczony na białej liście jako niewymagający uwierzytelnienia, ale gdy tylko uwierzytelnianie jest aktywne, zawsze kończy się niepowodzeniem z błędem HTTP 407.

Umieściłem powyższy kod w szelkach testowych i wypróbowałem każdą metodę, jaką mogłem wymyślić, aby skonfigurowaćrequest.Proxy nieruchomość bez powodzenia.

Wtedy zauważyłem, że wszystkie usługi internetowe innych firm, które musimy wywołać, to HTTPS. Gdy próbowałem uzyskać do nich dostęp jako HTTP, uwierzytelnianie proxy zaczęło działać. Czy jest jakiś dodatkowy element, który muszę przeskoczyć, aby uzyskać ładną autoryzację proxy i HTTPS?

PS: Te same problemy występują z serwerem proxy SmoothWall o otwartym kodzie źródłowym, więc nie mogę go po prostu zapisać jako błędu w serwerze ISA.

PPS: Wiem, że możesz skonfigurować ustawienia proxy wapp.config, ale (a) zrobienie tego w kodzie nie powinno mieć znaczenia, i (b) projekt aplikacji wymaga, abyśmy odczytali ustawienia proxy z bazy danych w czasie wykonywania.

questionAnswers(4)

yourAnswerToTheQuestion