WCF、元数据和BIGIP—我可以强制为WSDL项提供正确的url吗?
我们有一个WCF服务托管在ServerA上,它是一个没有直接Internet访问的服务器,具有非Internet可路由IP地址 该服务由BIGIP提供,BIGIP处理SSL加密和解密,并将未加密的请求转发到特定端口上的ServerA(目前它实际上没有进行任何负载平衡,但将来可能会添加负载平衡) 这意味着我们的客户将通过BIGIP设备调用服务,并通过BIGIP设备访问我们的服务 当我们浏览到在WSDL上发布的WSDL时,WSDL中包含的所有地址都基于基址 我们发现我们可以使用主机头设置来设置域,但我们的问题是,虽然这会对域进行排序,但我们仍然会使用错误的方案——当我们需要它是Https时,它会使用 另外–由于该服务器上托管了其他服务(基于asmx),因此设置主机头时出现了一些问题,因此我们认为可以在服务器上创建另一个站点(例如,使用端口82)并设置主机头;现在,除了http/https问题之外,我们还有一个问题,因为WSDL在所有URL中都包含端口号,BigIP在端口443上工作(对于SSL) 有没有比实现主机头更灵活的解决方案?理想情况下,我们需要保持灵活性和易支持性WCF、元数据和BIGIP—我可以强制为WSDL项提供正确的url吗?,wcf,wsdl,big-ip,Wcf,Wsdl,Big Ip,我们有一个WCF服务托管在ServerA上,它是一个没有直接Internet访问的服务器,具有非Internet可路由IP地址 该服务由BIGIP提供,BIGIP处理SSL加密和解密,并将未加密的请求转发到特定端口上的ServerA(目前它实际上没有进行任何负载平衡,但将来可能会添加负载平衡) 这意味着我们的客户将通过BIGIP设备调用服务,并通过BIGIP设备访问我们的服务 当我们浏览到在WSDL上发布的WSDL时,WSDL中包含的所有地址都基于基址 我们发现我们可以使用主机头设置来设置域,但
感谢您的帮助…如果您在现有服务的基础上添加SSL,它可能还会影响WCF客户端的绑定安全模式,您可以轻松覆盖该模式
对于WSDL,为什么不下载文件,将URL更改为任何您想要的内容,然后手动将其发布为文件?我得到了一个很好的提示,将端点上的address属性设置为希望在WSDL中显示的URL,然后向端点添加一个listenUri属性,并使用实际的Uri进行侦听,这样做就可以了 测试页面中的Url不会受到影响(即它仍将显示ListenUri中指定的地址),但在WSDL中会设置正确的Uri(地址中指定的Uri) 然而,最令人烦恼的是——当我在发布问题后不久尝试这个方法时,我无法让它在IIS中工作,只有在控制台应用程序中进行自我托管时;今天我检查自己发现它确实有效;所以现在我不确定为什么它以前对我不起作用
与此同时,我们所做的是构建一个简单的自定义行为,它改变了服务描述,将所需的地址从配置中放入WSDL;显然,如果有内置的支持,它会更好,因此我希望下周有时间进一步研究这一点。这本质上是一个多部分问题这涉及到许多离散的解决方案,以提供完整的答案。本质上,坐在F5后面有3个问题
我最终在CodePlex()上提供的WsdlExtras项目上编写了代码。WsdlExtras中使用的方法为您可能需要添加的任何额外位(从内存中,我认为它没有处理WS-Addressing位)提供了一个很好的基础。您要查看的位是“覆盖SOAP地址位置URL”.在服务类中添加以下属性:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
这将允许您在.config文件中添加扩展行为,并使用配置添加行为,而不必创建服务工厂
在system.servicemodel配置元素下添加:
<endpointBehaviors>
<behavior name="SSLLoadBalancerBehavior">
<flattenXsdImports/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
<add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
然后使用behaviorConfiguration属性在端点配置中引用新端点行为
<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
多亏了Mark Allanson,我得到了与yossi dahan完全相同的场景,WCFExtras.dll文件适合我 步骤1.下载WCFExtras.dll。
步骤2.将其引用添加到您的项目中。
步骤3.不要浪费时间编写示例服务器应用程序中建议的任何代码。
步骤4.打开web.config并输入以下代码:
步骤5.同样重要的是要注意,如果您通过此URL添加引用
“https://sslLoadBalancer/ServiceName.svc“
那么它将不起作用,请始终记住将引用添加为:”https://sslLoadBalancer/ServiceName.svc?wsdl“
这样,您就可以向应用程序添加引用。
就是这样…如果仍然不起作用,请告诉我,我将粘贴完整的web.config文件 谢谢Yossi,h
<endpointBehaviors>
<behavior name="SSLLoadBalancerBehavior">
<flattenXsdImports/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
<add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
<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>