如何在WCF客户端服务代理上设置HTTP代理(WebProxy)?

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

代理,代理,代理。

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

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

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

我们把这个东西叫做代理类,但是还有另一个代理 – http代理。 这个服务使用wsHttpBinding basicHttpBinding,所以它是通过HTTP。 现在,假设我想通过http代理(通过.NET BCL中的System.Net.WebProxybuild模)将客户端连接到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代理上设置身份validation?

有关:
– 如何设置代理凭证与生成wcf客户端

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

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

在WCF代理上没有Proxy属性是有道理的,因为并不是所有的WCF代理都使用HTTP进行通信。 进一步审查后,我发现,如果WCF代理使用HTTP绑定,可以以编程方式在WCF中设置代理。 我logging在这里,以防别人需要它。 要在代码中为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; 

在代码中设置terminal地址 – 到达服务器的位置 – 你可以这样做:

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

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

我试图通过一个UriBuilder,它会输出代理地址为“ http://用户名:密码@ myproxyserver / ”。 不幸的是,我使用的特定代理没有使用这种技术。

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

例如:

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

你也可以试试这个:

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

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

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