如何通过已配置的本地代理服务器进行WCF服务调用?

时间:2010-11-19 11:22:15

标签: c# .net wcf proxy service

我写了一个负责调用第三方WCF服务的类,它运行正常。我们的应用程序可以使用本地网络的代理设置进行配置,因此剩下的就是在拨打电话时使用这些设置(如果已经设置)。

我环顾四周,看不清楚如何做到这一点。我发现我正在使用的BasicHttpBinding对象具有ProxyAddress属性,但是没有任何内容可以让我定义网络凭据或用户名和密码。

它可能就在我面前,所以我想我只需指向正确的方向。至少我希望它就这么简单!我需要做的就是告诉我的服务调用本地代理服务器是什么以及使用什么凭据。

这是我实例化服务类的代码。我省略了构建请求类的下一部分,调用服务方法并处理结果。

// Create the service instance.
var binding = new BasicHttpBinding();
var endPoint = new EndpointAddress(new Uri(_servicesBaseUri + "MyServiceName"));
var service = new WSHsgCreateSchemeRepairClient(binding, endPoint);

// Add the MessageInspector to the contract behaviours list. This will inject the SecurityHeader XML and the SOAP action.
var soapAction = _servicesBaseUri + "MyServiceName/MyServiceMethod";
service.Endpoint.Contract.Behaviors.Add(new MessageInspector(_securityHeaderUsername, _securityHeaderPassword, soapAction));

我们有一些其他的Web服务调用(使用旧的Web服务方法)并且它们生成System.Net.WebProxy的新实例并将其设置为服务类Proxy属性,但显然它在WCF中是不同的。

感谢。

2 个答案:

答案 0 :(得分:2)

我想我已经解决了。可以设置和使用默认系统代理。 This is a very useful article如果有其他人违反了相同的要求。

这个想法是你必须首先设置System.Net.HttpWebRequest.DefaultWebProxy.Credentials(大概是System.Net.CredentialCache.DefaultCredentials) - 当你将绑定的UseDefaultWebProxy设置为{{}时,这就是“默认代理”参数的位置1}}。

答案 1 :(得分:0)

您可以通过特定于您的服务的web.config设置来执行此操作。 在绑定配置中,设置proxyAddress =“http:// myproxy:8080”并设置useDefaultWebProxy =“false”

<bindings>
  <basicHttpBinding>
    <binding name="SubscriberFulfilmentServiceSOAP12Binding" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00"
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
    textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="false"
    proxyAddress="http://myproxy:8080"
    messageEncoding="Text">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
      maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

设置所有服务的代理:

<system.net>
  <defaultProxy>
    <proxy usesystemdefault="True" proxyaddress="http://myproxy:8080" bypassonlocal="True" />
  </defaultProxy>
</system.net>