如何在 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 客户端

有帮助吗?

解决方案

代理设置是绑定配置的一部分。例如,看看 代理地址 的财产 基本HTTP绑定WSHttp绑定 类/配置元素。

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

其他提示

这是有道理的,有对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;否则你的代理服务器将被忽略。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top