我们有一个托管在ServerA上的WCF服务,它是一个不能直接访问互联网的服务器,并且有一个不可路由的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在所有urls中都包含端口号,而BigIP在端口443 (用于SSL)上工作。
是否有比实施主机报头更灵活的解决方案?理想情况下,我们需要保留灵活性和易支持性。
感谢你的帮助…
发布于 2009-04-17 13:49:49
这本质上是一个多部分的问题,涉及许多离散的解决方案来提供完整的答案。基本上,坐在F5后面有3个问题。
导入链接到xsd的通告服务端点hostname.
更改主机标头,正如您已经发现的解决方案1和2(您可以通过主机标头以外的其他方法来实现这一点,但不需要在这里进行介绍)。第三种方法有点棘手,需要更多的代码(太多了,不能在这里转储)。
简而言之,您需要编写同时实现IContractBehavior和IWsdlExportExtension的ContractBehavior。
您需要实现的重要部分是IWsdlExportExtension.ExportEndpoint。在这个方法中,您需要遍历所有的WsdlPort扩展,并且当您发现一个类型为SoapAddressBinding的扩展时,您需要用一个包含https协议说明符的新Uri替换SoapAddressBinding.Location属性。您还需要对xsd导入地址和模式链接执行类似的操作。
如果您的服务也在使用WS-Addressing,那么您需要执行类似的操作来处理它写入wsdl的附加地址。
我最终编写的代码基于CodePlex (http://wcfextras.codeplex.com/)上提供的WsdlExtras项目。WsdlExtras中使用的方法为您可能需要添加的任何额外位提供了一个很好的基础(在内存中,我认为它没有处理WS-Addressing位)。您要查看的内容是“覆盖SOAP地址位置URL”。
发布于 2013-11-21 18:21:40
多亏了Mark Allanson,我有了和yossi dahan完全相同的场景,WCFExtras.dll文件为我工作,
step1。下载WCFExtras.dll (http://www.codeplex.com/WCFExtras/)。
step2。将其引用添加到您的项目中。
step3。不要浪费时间按照示例服务器应用程序中的建议编写任何代码。
step4。打开web.config并放入以下代码:
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net><system.serviceModel>
<services>
<service behaviorConfiguration="ServiceBehaviorName" name="ServiceName">
<endpoint address="" behaviorConfiguration="ServiceEndpointBehaviorName" binding="basicHttpBinding" contract="IServiceName">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="ServiceEndpointBehaviorName">
<wsdlExtensions location="https://sslLoadBalancer/ServiceName.svc"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviorName">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<!-- Declare that we have an extension called WSDL Extras-->
<add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>step5。同样重要的是要注意,如果你通过这个URL "https://sslLoadBalancer/ServiceName.svc"添加引用,那么它将不起作用,永远记住添加引用为:"https://sslLoadBalancer/ServiceName.svc?wsdl",这样你就可以向你的应用程序添加引用了。
就是这样。如果仍然不起作用,请告诉我,我将粘贴完整的web.config文件。
谢谢
发布于 2009-03-28 05:57:42
如果在现有服务上添加SSL,可能还会影响WCF客户端的绑定安全模式,您可以很容易地覆盖该模式。
对于WSDL,为什么不直接下载文件,将URL更改为您想要的内容,然后手动将它们发布为文件呢?
https://stackoverflow.com/questions/634522
复制相似问题