Ошибка аутентификации прокси HTTP 407 при вызове веб-сервиса

Я работаю над приложением.NET, которое называет сторонние веб-сервисы по Интернету. Сервисы не используют SOAP, таким образом, мы вручную создаем документ запроса XML, отправьте его службе через HTTP и получите ответ XML.

Наш код является службой Windows, которая выполняется в контексте нормальной учетной записи домена Windows и находится позади прокси-сервера (Microsoft ISA Server), настроенная для требования аутентификации NTLM. Учетная запись, выполняющая наш сервис, имеет разрешение получить доступ к Интернету через прокси-сервер.

Код похож на это:

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

Это хорошо работает, если прокси-сервер выключен, или URL был добавлен в белый список как не требование аутентификации, но как только аутентификация активна, это всегда перестало работать с ошибкой HTTP 407.

Я поместил вышеупомянутый код в тестовую обвязку и попробовал каждый метод, о котором я мог думать для конфигурирования request.Proxy свойство, без успеха.

Я тогда заметил, что все сторонние веб-сервисы, которые мы должны назвать, являются HTTPS. Когда я пытался получить доступ к ним как к HTTP вместо этого, аутентификация прокси начала работать. Есть ли некоторый дополнительный обруч, до которого я должен перейти, заставляют аутентификацию прокси и HTTPS играть приятно?

PS: те же проблемы происходят с прокси-сервером SmoothWall с открытым исходным кодом, таким образом, я не могу только списать его как ошибку в Сервере ISA.

PPS: я знаю, что можно настроить настройки прокси в app.config, но (a) выполнение его в коде не должно иметь никакого значения и (b) проектирование приложений требует, чтобы мы считали настройки прокси из базы данных во времени выполнения.

10
задан Christian Hayter 26 January 2010 в 08:55
поделиться

2 ответа

Вы пытались установить прокси в App.config?

Чтобы отключить прокси в файле App.config Добавьте следующую конфигурацию

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

, чтобы включить прокси и использовать настройки прокси по умолчанию (указанные в IE), добавьте эту конфигурацию в вашем App.config

<system.net>
  <defaultProxy enabled="true" useDefaultCredentials="true">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>
13
ответ дан 3 December 2019 в 21:21
поделиться

Есть что-то не так с сертификатом вашего прокси-сервера? Если ваш сервис не может установить HTTPS, то он будет бросать ошибку.

0
ответ дан 3 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: