如何在 WCF 客户端服务代理上设置 HTTP 代理 (WebProxy)?
题
如何在 WCF 客户端上以编程方式设置 HTTP 代理,而不使用默认代理?
代理,代理,代理。
根据WCF的开发模型,我通过在WSDL上运行svcutil.exe生成客户端“代理”类。(这也会产生一个客户端配置文件)。
在我的代码中,我介绍了该类的实例,我可以连接到服务。很不错。
var svcProxy = new MyWebService();
svcProxy.GetInformation(request);
我们称这个东西为代理类,但是还有另一种代理——http代理。此服务正在使用wshtpbinding basichttpbinding,因此它正在越过HTTP。现在,假设我想通过HTTP代理将客户端连接到Web服务(由.NET BCL中的System.net.webproxy建模)。我从我的丰富,令人愉悦的阅读.NET和WCF文档中知道,WCF运行时(如果未另行指示)将在通过HTTP/HTTPS通信时使用默认的系统代理。
我可以从winxp / 2003中的命令行设置 使用 ProxyCfg.exe,如此处所述, ,以及以后版本的Windows 使用 netsh.exe,如此处所述.
我还可以通过设置默认的Web代理来在应用程序中使用 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生成的客户端代理类不会公开代理属性。如何为每个客户端代理设置 http 代理,以及如何在 http 代理上设置身份验证?
有关的:
- 如何将带有凭据的代理设置为生成的 WCF 客户端
其他提示
这是有道理的,有对WCF代理不代理财产,因为不是所有的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");
我有一个类似的问题,但我也需要使用用于从用于访问该服务的用户名和密码不同的代理用户名和密码。
我试图建立起来通过UriBuilder,这将输出代理地址为“ HTTP://用户名:密码@ myproxyserver / ”。不幸的是,我用的是特定的代理服务器没有使用该技术的工作。
我广泛的谷歌搜索后发现,是可以通过改变在WebRequest.DefaultProxy代理(静态属性)。
例如:
WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
您也可以试试这个:
编程获取任何绑定,您正在使用,然后设置代理服务器就可以直接e.g。
var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");
其中"WSDualHttpBinding_IMainService"
是从您的配置文件你的绑定的名称。
你也需要设置UseDefaultWebProxy=false
;否则你的代理服务器将被忽略。