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

Che*_*eso 47 wcf proxy http webproxy

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

代理,代理,代理.

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

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

var svcProxy = new MyWebService();
svcProxy.GetInformation(request); 
Run Code Online (Sandbox Code Playgroud)

我们将此事称为代理类,但还有另一个代理 - http代理.这个服务使用wsHttpBinding basicHttpBinding,所以它通过http.现在,假设我想通过http代理将客户端连接到Web服务(由.NET BCL中的System.Net.WebProxy建模).我从阅读.NET和WCF文档的丰富,愉快的经验中了解到,如果没有另外指示,WCF运行时将通过http/https进行通信时使用默认系统代理.

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

我还可以通过设置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); 
Run Code Online (Sandbox Code Playgroud)

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

相关:
- 如何设置代理与凭证到生成的wcf-client

Che*_*eso 55

有意义的是,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;
Run Code Online (Sandbox Code Playgroud)

要在代码中设置端点地址 - 到达服务器的位置,您可以执行以下操作:

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


tom*_*asr 26

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

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


Mar*_*rke 21

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

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

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

例如:

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

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