You need to enable JavaScript to run this app. WCF请求过代理返回407 Proxy Authentication Required错误的解决方案
优惠活动
大模型
产品
解决方案
定价
更多

WCF请求过代理返回407 Proxy Authentication Required错误的解决方案

解决方案

经过长时间排查,我找到了可行的解决方案。截至2021年10月19日,System.ServiceModel.***包的最新稳定版本为4.8.1,而4.9.0的候选发布版本恰好可以解决此问题。
我查阅.NET WCF的GitHub源代码,找到了该候选版本(版本号4.9.0-rc1.21431.2)正好匹配需求。开发团队更新了HttpTransportBindingElement,新增了Proxy属性。虽然它不是稳定版本,但完全可以满足需求。借助该属性我成功解决了问题,实现代码如下:

using (var myWsdlClient = new MyWsdlGeneratedClient())
{
    var binding = myWsdlClient.Endpoint.Binding as BasicHttpBinding;
    var customBinding = new CustomBinding(binding);

    var htbe = customBinding.Elements.Find<HttpTransportBindingElement>();
    htbe.AuthenticationScheme = AuthenticationSchemes.Basic;
    htbe.ProxyAuthenticationScheme = AuthenticationSchemes.Basic;
    htbe.UseDefaultWebProxy = false;
    htbe.BypassProxyOnLocal = false;
    htbe.Proxy = new WebProxy
    {
        Address = new Uri("http://myproxyaddress.com:8080"),
        /* 代理凭据 */
        Credentials = new NetworkCredential("MyProxyUserName", "MyProxyPassword"),
        BypassProxyOnLocal = false
    };

    myWsdlClient.Endpoint.Binding = customBinding;

    /* 客户端凭据 */
    myWsdlClient.ClientCredentials.UserName.UserName = "MyClientUserName";
    myWsdlClient.ClientCredentials.UserName.Password = "MyClientPassword";

    /* 发送请求 */
    myWsdlClient.Endpoint.Address = new EndpointAddress("https://myclientaddress.com");
    myWsdlClient.doSomeAction(actionRequest); // <-- 运行成功!
}

原始问题

我尝试通过Web代理发送WCF服务请求时,收到错误提示“Remote Server returned an error: (407) Proxy Authentication Required”。我已经通过WSDL生成了代理类,在app.config中配置了绑定和端点等内容(使用的是BasicHttpBinding)。问题在于:客户端和代理都需要Basic Authentication认证,但我只能配置客户端凭据,无法单独配置代理的凭据。
我已经尝试过以下方案:

  • 方案1:我在网上看到可以把凭据直接放到代理的URL中,所以我通过代码配置了绑定的ProxyAddress属性,实现代码如下:
using (var myWsdlClient = new MyWsdlGeneratedClient())
{
    var binding = myWsdlClient.Endpoint.Binding as BasicHttpBinding;

    /* 客户端凭据 */
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
    myWsdlClient.ClientCredentials.UserName.UserName = "MyClientUserName";
    myWsdlClient.ClientCredentials.UserName.Password = "MyClientPassword";

    /* 代理凭据 */
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
    binding.UseDefaultWebProxy = false;
    binding.BypassProxyOnLocal = false;
    binding.ProxyAddress = new Uri("http://MyProxyUserName:MyProxyPassword@myproxyaddress.com:8080");

    /* 发送请求 */
    myWsdlClient.Endpoint.Address = new EndpointAddress("https://myclientaddress.com");
    myWsdlClient.doSomeAction(actionRequest); // <-- 此处抛出错误,内部异常为407 HTTP响应
}
  • 方案2:我也尝试过修改默认Web代理,该方法可以正常运行,实现代码如下:
using (var myWsdlClient = new MyWsdlGeneratedClient())
{
    var binding = myWsdlClient.Endpoint.Binding as BasicHttpBinding;

    /* 客户端凭据 */
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
    myWsdlClient.ClientCredentials.UserName.UserName = "MyClientUserName";
    myWsdlClient.ClientCredentials.UserName.Password = "MyClientPassword";

    /* 代理凭据 */
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
    binding.UseDefaultWebProxy = true;
    binding.BypassProxyOnLocal = false;

    var defaultProxyBefore = WebRequest.DefaultWebProxy;
    var newProxy = new WebProxy
    {
        Address = new Uri("http://myproxyaddress.com:8080"),
        Credentials = new NetworkCredential("MyProxyUserName", "MyProxyPassword"),
        BypassProxyOnLocal = false
    };
    WebRequest.DefaultWebProxy = newProxy;

    /* 发送请求 */
    myWsdlClient.Endpoint.Address = new EndpointAddress("https://myclientaddress.com");
    try
    {
        myWsdlClient.doSomeAction(actionRequest);
    }
    finally
    {
        WebRequest.DefaultWebProxy = defaultProxyBefore;
    }
}

第二种方案虽然可以正常运行,但不符合项目需求。我开发的应用每秒要处理多线程下的大量请求,部分请求需要走默认代理,我不希望无关请求走我临时设置的新代理,它们应该继续使用默认配置。
总结来看,我需要实现单请求独立配置代理,同时支持客户端和代理的双Basic Authentication认证。我对WCF不太熟悉,偶然了解到自定义绑定的概念,看起来可以解决问题,但我还没找到具体实现方法,希望能得到相关帮助。


内容的提问来源于stack exchange,提问作者jaw64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 22:30:05