调用Web服务时出现HTTP 407代理身份验证错误

Chr*_*ter 10 .net c# authentication proxy windows-services

我正在开发一个通过互联网调用第三方Web服务的.NET应用程序.服务不使用SOAP,因此我们手动构造XML请求文档,通过HTTP将其发送到服务,并检索XML响应.

我们的代码是在正常Windows域帐户的上下文中运行的Windows服务,并且位于配置为需要NTLM身份验证的代理服务器(Microsoft ISA Server)后面.运行我们服务的帐户有权通过代理服务器访问互联网.

代码如下所示:

// 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果代理服务器已关闭,或者URL已列入白名单而不需要身份验证,则此方法可以正常工作,但只要身份验证处于活动状态,它就会因HTTP 407错误而失败.

我将上面的代码放在测试工具中,并尝试了我能想到的每个方法来配置request.Proxy属性,但没有成功.

然后我注意到我们必须调用的所有第三方Web服务都是HTTPS.当我尝试将它们作为HTTP访问时,代理身份验证开始工作.是否有一些额外的箍我必须跳过才能获得代理身份验证和HTTPS才能很好地发挥作用?

PS:开源SmoothWall代理服务器出现同样的问题,所以我不能把它作为ISA Server中的错误写出来.

PPS:我知道您可以在其中配置代理设置app.config,但是(a)在代码中执行它不应该有任何区别,并且(b)应用程序设计要求我们在运行时从数据库中读取代理设置.

abh*_*ash 13

您是否尝试在app.config中设置代理?

要禁用代理,请在App.config文件中添加以下配置

<system.net>
  <defaultProxy enabled="false" useDefaultCredentials="false">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>
Run Code Online (Sandbox Code Playgroud)

要启用代理并使用默认代理设置(在IE中指定),请在App.config中添加此配置

<system.net>
  <defaultProxy enabled="true" useDefaultCredentials="true">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>
Run Code Online (Sandbox Code Playgroud)


Chr*_*ter 1

我想我将不得不注销这个问题。我原来发布的代码有时似乎确实有效。我们的代理服务器极不可靠;前一分钟它会阻止任何软件的互联网连接,下一分钟就会允许它。IT 人员似乎对此无能为力,而我们(IT 部门以外的每个人)也无权更改网络基础设施。

如果有人对如何“强化”我的代码以补偿不可靠的代理服务器有任何想法,那么我很想听听他们的想法。:-)

  • 为那些遇到此问题的人发布故障排除提示:它可能是代理服务器配置/软件,但首先检查像这样的间歇性问题是消除部分集群故障。如果负载均衡器后面有多个代理服务器,并且只有一个配置正确,则只有在平衡到“良好”实例时才能通过。有时。 (3认同)