2009-06-04 307 views
39

如何在不使用默认代理的情况下在WCF客户端上以编程方式设置HTTP代理?如何在WCF客户端服务代理上设置HTTP代理(WebProxy)?

代理,代理,代理。

根据开发的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运行时,WCF运行时将在通过http/https进行通信时使用默认的 系统代理。

我可以设置在命令行中 的WinXP/2003 with ProxyCfg.exe as described here,并在以后 版本的Windows with netsh.exe as described here的。

我还可以通过设置System.Net.WebRequest.DefaultWebProxy property来指定应用程序 内使用的默认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

回答

21

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

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

42

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

// 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"); 
+0

+1用于铸造BasicHttpBinding – Lijo 2012-11-28 09:46:19

17

我有类似的问题,但我也需要使用代理的用户名和密码,这与用于访问服务的用户名和密码不同。

我试着通过UriBuilder构建它,它将输出代理地址为“http://username:[email protected]/”。不幸的是,我使用的特定代理没有使用这种技术。

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

例如:

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

是的。当然,如果你这样做,你必须设置UseDefaultWebProxy = true。 我认为还有一种方法可以在每个客户端绑定的基础上执行此操作。如果b是一个System.ServiceModel.BasicHttpBinding,则需要将b.Security.Transport.ProxyCredentialType设置为您的代理所需的任何内容。枚举是HttpProxyCredentialType,可能的值是{None,Basic,Digest,Ntlm,Windows}。看到这个帖子的提示: http://kennyw.com/indigo/106 – Cheeso 2009-06-26 18:18:33

2

你也可以试试这个:

编程得到任何绑定,您正在使用,然后设置代理就可以直接例如

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

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