使用代理从类项目调用WCF服务

时间:2014-01-31 11:18:41

标签: c# wcf web-services ssl proxy

我需要使用来自类项目的双向SSL对外部第三方进行WCF服务调用。我已将第三方提供的WSDL作为服务引用添加到我的项目中。问题是我们域外的所有呼叫(* .abc.com)都通过代理服务器

http://ironport:8080

这就是我在代码中所做的 -

var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.BypassProxyOnLocal = false;
binding.UseDefaultWebProxy = true;
binding.AllowCookies = false;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;

var endpoint = new EndpointAddress("https://blablabla.com/GetData.svc");
var client = new AccountClient(binding, endpoint);
X509Certificate2 certi = new X509Certificate2(@"path to pfx file", "password");
client.ClientCredentials.ClientCertificate.Certificate = certi;

我使用 -

进行服务调用
var account = client.ExportAccounts(obj1, obj2, obj3);

然后它给我一个错误 -

The remote server returned an Error (407): Proxy authentication required

这很明显,因为我没有提到请求需要经历的代理详细信息。我需要的是一种方法,将以下信息从不同项目的web.config文件添加到我上面的请求中 -

<system.net>
<defaultProxy useDefaultCredentials="true">
  <proxy proxyaddress="http://ironport:8080" />
  <bypasslist>
    <add address="[\w]+\.abc\.com$" />
  </bypasslist>
</defaultProxy>
</system.net>

有没有办法在代码中实现这一点?或者我是否需要以完全不同的方式解决这个问题?如果我需要发布更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用WebProxy Class。没有经过测试,但是这样的事情:

WebProxy proxy = new WebProxy("http://ironport:8080");
proxy.BypassList = new string[] { "[\w]+\.abc\.com$" };

另一种方法是将配置的相关部分移动到使用您的类库的应用程序的web / app.config。

<强> ADDED

不是100%确定这会有效,但您可以尝试将此行添加到您的代码中:

WebRequest.DefaultProxy = proxy;

取自answer

另一种选择可能是使用ProxyAddress的{​​{1}}属性(确保在这种情况下将WsHttpBinding设置为false),但我看不到添加方法这个旁路列表。