【问题标题】:HTTP 407 proxy authentication error when calling a web service调用 Web 服务时出现 HTTP 407 代理身份验证错误
【发布时间】:2011-01-09 01:41:06
【问题描述】:

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

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

代码如下:

// 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 属性,但没有成功。

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

PS:开源的 SmoothWall 代理服务器也会出现同样的问题,所以我不能把它当作 ISA Server 中的一个 bug 写下来。

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

【问题讨论】:

    标签: c# .net authentication windows-services proxy


    【解决方案1】:

    您是否尝试在 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>
    

    【讨论】:

    • 我已经尝试过了,我得到了相同的结果。它适用于 HTTP 地址,但适用于 HTTPS。
    【解决方案2】:

    我也遇到过类似情况

    在运行代码之前访问互联网时,您是否注意到它有效?如果您已经很久没有访问互联网了(对我来说是 20 分钟),您就会收到错误消息。

    您是否尝试过直接设置代理凭据?

    //setup the proxy
    request.Proxy = new WebProxy("proxyIp", 8080);
    request.Proxy.Credentials = CredentialCache.DefaultCredentials;
    

    我希望这也能解决您的问题

    【讨论】:

    • 您好 Dbones,感谢您分享您的经验!不幸的是,即使在几秒钟前成功连接后,我也观察到代理服务器突然失败。我也确实尝试过在代码中定义代理的确切方法,它没有任何区别。
    • 哇,我不想说,但以上解决了我的问题。希望您能找到适合您情况的解决方案
    【解决方案3】:

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

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

    【讨论】:

    • 这就是我的情况。有时我可以连接而不会出现此错误。
    • 作为故障排除提示发布给那些浏览此问题的人:它可能是代理服务器配置/软件,但像这样的间歇性问题的第一次检查是消除部分集群故障。如果负载均衡器后面有多个代理服务器,并且只有一个配置正确,那么您只有在平衡到“好”实例时才能通过,也就是。有时。
    【解决方案4】:

    您的代理服务器证书有问题吗?如果您的服务无法建立 HTTPS,则会抛出错误。

    【讨论】:

    • 我已经询问了我们的 IT 管理员,他们说它肯定配置为支持 SSL。他们通过代理服务器成功浏览到 HTTPS 网站。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多