我们在ServerA上托管了一个WCF服务,该服务是一个没有直接Internet访问的服务器,并且具有非Internet可路由的IP地址.
该服务由BIGIP提供,它处理SSL加密和解密,并将未加密的请求转发到ServerA(此时它实际上不会进行任何负载平衡,但可能会在将来添加)在特定端口上.
这意味着我们的客户将通过https://www.OurDomain.com/ServiceUrl调用该服务,并通过BIGIP设备在http:// SeverA:85/ServiceUrl上获得我们的服务;
当我们浏览https://www.OurDomain.com/ServiceUrl上发布的WSDL 时,WSDL中包含的所有地址都基于http:// SeverA:85/ServiceUrl基地址
我们发现我们可以使用主机头设置来设置域,但我们的问题是虽然这会解析域,但我们仍然会使用错误的方案 - 它会使用http://www.OurDomain.com/ServiceUrl,而我们需要它是Https.
另外 - 由于我们在该服务器上托管了其他服务(基于asmx),我们在设置主机头时遇到了一些问题,因此我们认为我们可以在服务器上创建另一个站点(使用端口82)并设置主机头; 现在,除了http/https问题之外,我们遇到了一个问题,因为WSDL包含所有URL中的端口号,其中BigIP在端口443上工作(对于SSL)
是否有比实现主机头更灵活的解决方案?理想情况下,我们需要保持灵活性和易于支持性.
谢谢你的帮助…
这本质上是一个多部分问题,涉及许多离散的解决方案,以提供完整的答案.基本上坐在F5后面有3个问题.
公布的服务端点主机名.
指向数据协定的xsd:import'ed模式的链接的主机名
您描述的http/https问题.
更改主机头,因为您已找到解决方案1和2(您可以通过主机头以外的方式处理此问题,但不需要在此处进行此操作).3号有点棘手,需要更多代码(在这里转储太多).
简短的回答是您需要编写一个实现IContractBehavior和IWsdlExportExtension的ContractBehavior.
您需要实现的重要位是IWsdlExportExtension.ExportEndpoint.在此方法中,您需要遍历所有WsdlPort扩展,当您找到类型为SoapAddressBinding的扩展时,您需要将SoapAddressBinding.Location属性替换为包含https协议说明符的新Uri.您还需要为xsd导入地址和架构链接执行类似的操作.
如果您的服务也使用WS-Addressing您需要执行类似的操作来处理它写入wsdl的其他地址.
我根据CodePlex(http://wcfextras.codeplex.com/)上提供的WsdlExtras项目编写了代码.WsdlExtras中使用的方法为您可能需要添加的任何额外位提供了一个很好的基础(从内存中我不认为它处理WS-Addressing位).您要查看的位是"覆盖SOAP地址位置URL".