【问题标题】:How can I set an HTTP Proxy (WebProxy) on a WCF client-side Service proxy?如何在 WCF 客户端服务代理上设置 HTTP 代理 (WebProxy)?
【发布时间】:2010-10-31 09:26:15
【问题描述】:

如何在 WCF 客户端上以编程方式设置 HTTP 代理,而不使用默认代理?

代理,代理,代理。

根据开发的WCF模型,我生成客户端“代理” 通过在服务的 WSDL 上运行 svcutil.exe 来进行类。 (这也是 生成一个客户端配置文件)。

在我的代码中,我新建了一个该类的实例,我可以连接到 服务。很不错。

var svcProxy = new MyWebService();
svcProxy.GetInformation(request); 

我们称这个东西为代理类,但还有另一个代理——http 代理。这 服务正在使用 wsHttpBinding basicHttpBinding,所以它正在结束 http。现在,假设我想通过以下方式将客户端连接到 Web 服务 http 代理(由 .NET BCL 中的 System.Net.WebProxy 建模)。我知道 根据我阅读 .NET 和 WCF 文档的广泛而愉快的经验, WCF 运行时,如果没有另外说明,将使用默认值 通过 http/https 通信时的系统代理。

我可以在命令行中设置 WinXP / 2003 with ProxyCfg.exe as described here 及更高版本 Windows 版本with netsh.exe as described here

我还可以指定在应用程序中使用的默认 Web 代理 通过设置System.Net.WebRequest.DefaultWebProxy property

但是假设我想通过一个不同于 系统范围的代理?例如,也许没有系统范围的代理,但是 我特别需要将一个用于 Web 服务。或者也许有 一个系统范围的代理,但我需要为网络使用不同的代理 服务。事实上,也许有多个 Web 服务客户端,并且 每个人都应该得到一个不同的代理。

如何为每个绑定设置代理?

在 ASMX 模型中,我可以这样做:

var svcProxy = new MyWebService();
svcProxy.Proxy = new System.Net.WebProxy("http://proxyserver:1234", true);
svcProxy.GetInformation(request); 

但这对于 WCF 是不可能的; WCF 生成的客户端代理 类不公开代理属性。如何为每个客户端代理设置 http 代理,以及如何在 http 代理上设置身份验证?

相关:
- how-to-set-proxy-with-credentials-to-generated-wcf-client

【问题讨论】:

    标签: wcf http proxy webproxy


    【解决方案1】:

    WCF 代理上没有 Proxy 属性是有道理的,因为并非所有 WCF 代理都使用 HTTP 进行通信。经过进一步审查,我发现如果 WCF 代理使用 HTTP 绑定,则可以通过编程方式在 WCF 中设置代理。我在这里记录它以防其他人需要它。要在代码中为 WCF 客户端设置 HTTP 代理,请执行以下操作:

    // instantiate a proxy for the service
    var svc= new ServiceClient();
    // get the HTTP binding
    var b = svc.Endpoint.Binding as System.ServiceModel.BasicHttpBinding;
    b.ProxyAddress = new Uri("http://127.0.0.1:8888");
    b.BypassProxyOnLocal = false;
    b.UseDefaultWebProxy = false;
    

    并且要在代码中设置端点地址 - 到达服务器的位置 - 你可以这样做:

    var e = svc.Endpoint;
    e.Address = new System.ServiceModel.EndpointAddress(
        "http://remoteserver:5555/WcfXmlElement");
    

    【讨论】:

    • 十年后!
    【解决方案2】:

    代理设置是绑定配置的一部分。例如,查看BasicHTTPBindingWSHttpBinding 类/配置元素的ProxyAddress 属性。

    看起来您将端点配置保留在 app.config 文件中,在这种情况下,您应该可以在那里设置地址。

    【讨论】:

      【解决方案3】:

      我也遇到过类似的问题,但我还需要为代理使用不同于用于访问服务的用户名和密码的用户名和密码。

      我尝试通过 UriBuilder 构建它,它将代理地址输出为“http://username:password@myproxyserver/”。不幸的是,我使用的特定代理不适用于这种技术。

      我在大量谷歌搜索后发现,您可以通过 WebRequest.DefaultProxy (静态属性)更改代理。

      例如:

      WebProxy proxy = new WebProxy("http://myproxyserver",true);
      proxy.Credentials = new NetworkCredential("username", "password");
      WebRequest.DefaultWebProxy = proxy;
      

      【讨论】:

      • 是的。当然,如果您这样做,您必须设置 UseDefaultWebProxy=true。我认为还有一种方法可以在每个客户端绑定的基础上做到这一点。如果 b 是 System.ServiceModel.BasicHttpBinding,您需要将 b.Security.Transport.ProxyCredentialType 设置为您的代理所需的任何内容。枚举为 HttpProxyCredentialType,可能的值为 {None, Basic, Digest, Ntlm, Windows}。请参阅此帖子以获取提示:kennyw.com/indigo/106
      • 感谢 Cheeso 的链接。当我星期一回到办公室时,我会试一试:)
      • 这是我想要的,但不想以编程方式或在某些配置文件中设置凭据。我的客户端应用程序需要自动检测代理地址和端口、用户凭据(如果需要,还需要域)。如果代理不需要身份验证,现在确实部分按我想要的方式工作。代理地址是自动从 windows 网络设置中检测到的。我怎样才能获得以相同方式工作的凭据?我不想(再次)提示用户输入密码。
      • 另外,应该注意的是,如果不是您的所有呼叫都将通过代理,这可能会导致意外结果。大多数情况下,除非您了解其中的含义,否则不应设置默认 Web 代理
      【解决方案4】:

      你也可以试试这个:

      以编程方式获取您正在使用的任何绑定,然后直接在其上设置代理,例如

      var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
      binding.ProxyAddress = new Uri("http://192.168.5.1:3128");
      

      其中"WSDualHttpBinding_IMainService" 是配置文件中绑定的名称。 你也必须设置UseDefaultWebProxy=false;否则您的代理将被忽略。

      【讨论】:

        【解决方案5】:

        我为可能使用 .NET Core 2.x 的人找到了解决方案

        在尝试使用

        设置代理时最初会导致问题

        System.ServiceModel.BasicHttpBinding;

        由 Cheeso 回答。

        您必须将 WCF 更新到最新版本 (v.4.7.0)。

        转到 NuGet 包管理器 -> 更新 WCF 的所有相关项目 URL。

        必须有:

        • System.ServiceModel.Security
        • System.ServiceModel.NetTcp
        • System.ServiceModel.Http

        【讨论】:

        • 非常感谢。我一直遇到“使用非空代理时,必须将 WindowsProxyUsePolicy 属性设置为 WindowsProxyUsePolicy.UseCustomProxy”这是有效的魔术修复。
        猜你喜欢
        • 2017-03-22
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 2012-05-12
        相关资源
        最近更新 更多