如何在不使用默认代理的情况下在WCF客户端上以编程方式设置HTTP代理?
代理,代理,代理。
根据WCF的开发模型,我生成客户端“代理” 通过在服务的WSDL上运行svcutil.exe来创建类。 (这也是 生成客户端配置文件。)
在我的代码中,我新建了该类的一个实例,我可以连接到 服务。很好。
var svcProxy = new MyWebService();
svcProxy.GetInformation(request);
我们将此事称为代理类,但还有另一个代理 - http代理。这个 service正在使用wsHttpBinding basicHttpBinding,所以它正在结束 HTTP。现在,假设我想将客户端连接到Web服务 一个http代理(由.NET BCL中的System.Net.WebProxy建模)。我知道 从我阅读.NET和WCF文档的丰富,愉快的经验来看 如果没有另外指示,WCF运行时将使用默认值 通过http / https进行通信时的系统代理。
我可以从命令行设置 WinXP / 2003 with ProxyCfg.exe as described here,以及稍后的版本 Windows with netsh.exe as described here的版本。
我还可以指定在应用程序中使用的默认Web代理 通过设置System.Net.WebRequest.DefaultWebProxy property。
但是假设我想通过不同于的代理连接 系统范围的代理?例如,可能没有系统范围的代理 我需要特别使用一个用于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
答案 0 :(得分:51)
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");
答案 1 :(得分:25)
代理设置是绑定配置的一部分。例如,查看ProxyAddress和BasicHTTPBinding类/配置元素的WSHttpBinding属性。
您似乎将端点配置保留在app.config文件中,在这种情况下,您应该可以在那里设置地址。
答案 2 :(得分:20)
我遇到了类似的问题,但我还需要使用与用于访问服务的用户名和密码不同的代理用户名和密码。
我尝试通过UriBuilder构建它,它会将代理地址输出为“http://username:password@myproxyserver/”。不幸的是,我使用的特定代理并没有使用这种技术。
我在广泛的Google搜索后发现,您可以通过WebRequest.DefaultProxy(静态属性)更改代理。
例如:
WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
答案 3 :(得分:3)
你也可以试试这个:
以编程方式获取您正在使用的任何绑定,然后直接在其上设置代理,例如。
var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");
其中"WSDualHttpBinding_IMainService"
是配置文件中绑定的名称。
你还必须设置UseDefaultWebProxy=false
;否则你的代理将被忽略。
答案 4 :(得分:0)
我为可能使用.NET Core 2.x的人找到了解决方案
尝试使用
设置代理时最初会引起问题System.ServiceModel.BasicHttpBinding;
如Cheeso回答。
您必须将WCF更新到最新版本(v.4.7.0)。
转到NuGet程序包管理器->更新WCF的所有相关项目URL。
必须有: