WCF、元数据和BIGIP—我可以强制为WSDL项提供正确的url吗?

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中包含的所有地址都基于基址 我们发现我们可以使用主机头设置来设置域,但

我们有一个WCF服务托管在ServerA上,它是一个没有直接Internet访问的服务器,具有非Internet可路由IP地址

该服务由BIGIP提供,BIGIP处理SSL加密和解密,并将未加密的请求转发到特定端口上的ServerA(目前它实际上没有进行任何负载平衡,但将来可能会添加负载平衡)

这意味着我们的客户将通过BIGIP设备调用服务,并通过BIGIP设备访问我们的服务

当我们浏览到在WSDL上发布的WSDL时,WSDL中包含的所有地址都基于基址

我们发现我们可以使用主机头设置来设置域,但我们的问题是,虽然这会对域进行排序,但我们仍然会使用错误的方案——当我们需要它是Https时,它会使用

另外–由于该服务器上托管了其他服务(基于asmx),因此设置主机头时出现了一些问题,因此我们认为可以在服务器上创建另一个站点(例如,使用端口82)并设置主机头;现在,除了http/https问题之外,我们还有一个问题,因为WSDL在所有URL中都包含端口号,BigIP在端口443上工作(对于SSL)

有没有比实现主机头更灵活的解决方案?理想情况下,我们需要保持灵活性和易支持性


感谢您的帮助…

如果您在现有服务的基础上添加SSL,它可能还会影响WCF客户端的绑定安全模式,您可以轻松覆盖该模式


对于WSDL,为什么不下载文件,将URL更改为任何您想要的内容,然后手动将其发布为文件?

我得到了一个很好的提示,将端点上的address属性设置为希望在WSDL中显示的URL,然后向端点添加一个listenUri属性,并使用实际的Uri进行侦听,这样做就可以了

测试页面中的Url不会受到影响(即它仍将显示ListenUri中指定的地址),但在WSDL中会设置正确的Uri(地址中指定的Uri)

然而,最令人烦恼的是——当我在发布问题后不久尝试这个方法时,我无法让它在IIS中工作,只有在控制台应用程序中进行自我托管时;今天我检查自己发现它确实有效;所以现在我不确定为什么它以前对我不起作用


与此同时,我们所做的是构建一个简单的自定义行为,它改变了服务描述,将所需的地址从配置中放入WSDL;显然,如果有内置的支持,它会更好,因此我希望下周有时间进一步研究这一点。

这本质上是一个多部分问题这涉及到许多离散的解决方案,以提供完整的答案。本质上,坐在F5后面有3个问题

  • 播发的服务端点主机名
  • 指向描述数据协定的xsd:import'ed模式的链接的主机名
  • 您描述的http/https问题
  • 正如您所发现的,更改主机头可以解决1和2(您可以通过主机头以外的其他方式来解决这一问题,但无需在此深入讨论)。第3个问题有点棘手,需要更多的代码(在这里转储的代码太多)

    简而言之,您需要编写一个ContractBehavior来实现IContractBehavior和IWsdlExportExtension

    需要实现的重要一点是IWsdlExportExtension.ExportEndpoint。在此方法中,您需要迭代所有WsdlPort扩展,当您找到SoapAddressBinding类型的扩展时,您需要使用包含https协议说明符的新Uri替换SoapAddressBinding.Location属性。您可以还需要为xsd导入地址和模式链接执行类似的位

    如果您的服务也在使用WS-Addressing,那么您需要执行类似的操作来处理它写入wsdl的其他地址


    我最终在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>