50

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

代理,代理,代理。

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

在我的代码中,我新建了该类的一个实例,并且可以连接到该服务。非常好。

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

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

我可以在 WinXP/2003 的命令行中使用 ProxyCfg.exe 进行设置,如此处所述,在更高版本的 Windows中使用 netsh.exe 进行设置,如此处所述

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

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

如何按绑定设置代理?

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

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

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

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

4

5 回答 5

65

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");
于 2009-06-10T12:37:36.563 回答
27

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

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

于 2009-06-05T03:11:47.713 回答
22

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

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

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

例如:

WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
于 2009-06-26T07:57:45.380 回答
4

你也可以试试这个:

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

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

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

于 2010-11-29T09:59:07.237 回答
2

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

尝试使用设置代理时最初会导致问题

System.ServiceModel.BasicHttpBinding;

正如 Cheeso 所回答的那样。

You have to update WCF to the latest (v.4.7.0).

Go to NuGet Package Manager -> Update all related Project URL of WCF.

There must be:

  • System.ServiceModel.Security
  • System.ServiceModel.NetTcp
  • System.ServiceModel.Http
于 2020-01-31T04:56:04.273 回答