代码之家  ›  专栏  ›  技术社区  ›  Christian Hayter

调用web服务时HTTP 407代理身份验证错误

  •  10
  • Christian Hayter  · 技术社区  · 16 年前

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

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

    // 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 财产,没有成功。

    然后我注意到我们必须调用的所有第三方web服务都是HTTPS。当我尝试以HTTP方式访问它们时,代理身份验证开始工作。为了让代理身份验证和HTTPS更好地发挥作用,我还需要跳过一些额外的障碍吗?

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

    4 回复  |  直到 16 年前
        1
  •  13
  •   abhilash    16 年前

    您是否尝试过在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>
    
        2
  •  3
  •   dbones    8 年前

    在运行代码之前访问internet时,您是否注意到它起作用了?如果你已经很久没有上网了(对我来说是20分钟),你就会出错。

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

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

        3
  •  1
  •   Christian Hayter    15 年前

    我想我得把这个问题一笔勾销了。我最初发布的代码有时确实有效。我们的代理服务器非常不可靠;前一分钟它将阻止任何软件的互联网连接,下一分钟它将允许它。IT人员似乎无能为力,我们(IT部门以外的所有人)无权更改网络基础设施。

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

        4
  •  0
  •   AUSteve    16 年前

    代理服务器的证书是否有问题?如果您的服务无法建立HTTPS,那么它将抛出一个错误。

    推荐文章