F5负载均衡器后面的WCF服务(wsHttpBinding绑定)

时间:2010-11-09 14:13:45

标签: wcf https f5

当前设置: - 我有一个wsHttpBding的WCF服务,请参阅下面的服务配置 - 我已经实现了ServiceHostFactory来解决模式位置和soap地址不正确的问题,将它们从机器名修改为正确的服务器主机名 - 我的测试客户端(WCFStorm)我可以生成代理,查看所有方法并成功调用它们。 - 我的开发环境(客户端 - > HTTPS - >服务)运行良好。

问题: - prod环境(客户端 - > HTTPS - > F5 - > HTTP - >服务) - 我的服务是支持卸载SSL的F5负载均衡器 - 我的测试客户端(WCFStorm)我可以生成代理并查看所有方法,但是当我调用任何方法时,我得到的远程服务器未找到404错误

  • 我的服务配置: <services> <service behaviorConfiguration="Service1Behavior" name="MyService"> <endpoint name="secure" address="" binding="wsHttpBinding" bindingConfiguration="custBinding" contract="IService"/> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <wsHttpBinding> <binding name="custBinding"> <security mode="Transport"> <transport clientCredentialType="None" /> <message clientCredentialType="None" negotiateServiceCredential="false" establishSecurityContext="false" /> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="Service1Behavior"> <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" httpGetUrl="http://myserver/MyService.svc"/> <serviceDebug includeExceptionDetailInFaults="true"/> <dataContractSerializer maxItemsInObjectGraph="6553600" /> </behavior> </serviceBehaviors> </behaviors>

  • 请注意,wsdl上的所有架构位置和soap地址在prod中都是正确的,但我根本无法调用任何方法。

请帮忙。

4 个答案:

答案 0 :(得分:3)

我们有类似的情况,这就是我们如何使它发挥作用。

在服务中 - 我们更改了绑定以使用basicHttpBinding并添加了一个必须随每个请求传递的密钥。

在客户端 - 我们将配置中的http更改为https,并在basicHttpBindings配置中将安全模式更改为Transport clientCredentialType="None"

希望这有帮助。

更新:我很快就找到了这篇文章,我更新了配置,但它确实有效。所以现在我们使用wsHttpBinding而不是basicHttpBinding。 http://blogs.msdn.com/b/morgan/archive/2010/04/15/setting-up-wcf-with-a-load-balancer-using-ssl-in-the-middle.aspx

答案 1 :(得分:1)

您的服务配置问题是安全模式为Transport,实际上应该是None。由于对您的服务的任何调用都是F5负载均衡器后面的HTTP,因此您无法使用Transport安全模式(客户端 - &gt; HTTPS - &gt; F5 - &gt; HTTP - &gt;服务)。但是,从客户端调用服务时,客户端配置需要Transport安全模式,端点地址需要HTTPS地址。

  <wsHttpBinding>
    <binding name="custBinding">
      <security mode="None">
        <transport clientCredentialType="None" />
        <message clientCredentialType="None" negotiateServiceCredential="false" establishSecurityContext="false" />
      </security>
    </binding>
  </wsHttpBinding>

答案 2 :(得分:0)

这对你来说可能有点晚了,但这就是我们这样做的方式。生成代理后,我只需将配置中的http:更改为https。现在,如果我有时必须使用ssl和othertimes调用它,我将复制配置部分,并为副本提供不同的名称,然后在构建客户端时,您可以传入配置名称,它将拿起正确的。

答案 3 :(得分:0)

我们无法通过第7层负载平衡来实现这一点 - 从服务返回了各种错误消息。相反,它设置了第4层负载平衡,没有任何问题。