C# WCF服务web.config调整以更改生成的wdl

C# WCF服务web.config调整以更改生成的wdl,c#,wcf,ssl,load-balancing,f5,C#,Wcf,Ssl,Load Balancing,F5,我的wcf服务遵循以下负载平衡结构: 公共(https)->F5LB(http)->node1/node2 我在http方案上公开服务,F5LB负责ssl卸载。由于我的服务公开为http,因此通过F5 LB生成的wsdl包含基于http的url,如下所示: 我的LB服务URL: 生成的服务页面为: MyService Service You have created a service. To test this service, you will need to create a cli

我的wcf服务遵循以下负载平衡结构:

公共(https)->F5LB(http)->node1/node2

我在http方案上公开服务,F5LB负责ssl卸载。由于我的服务公开为http,因此通过F5 LB生成的wsdl包含基于http的url,如下所示:

我的LB服务URL:

生成的服务页面为:

MyService Service

You have created a service.

To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:    

svcutil.exe http://myservice.mydomain.com/service1.svc?wsdl

You can also access the service description as a single file:

http://myservice.mydomain.com/service1.svc?singleWsdl
正如您所注意到的,生成的页面具有从应用程序节点公开的http url。因为F5LB将服务公开为https,所以它不允许上面的http url,并且来自客户端的请求正在反弹


现在,我们可以调整我的服务web.config以在http方案上公开服务,但让wsdl指向httpsurl,这样从F5 LB生成的url也可以是https,客户端可以在https上工作,LB的请求将在http上服务,我的服务可以处理吗?

我从来没有这样做过,但与WCF中的大多数内容一样,您可以连接到一些扩展点来覆盖其默认行为

听起来您需要做的是实现一个定制的“元数据”端点。上有一系列关于MSDN的文章。具体地说,您可以实现一个在将WSDL数据发送到客户端之前访问它的方法

这似乎与大多数其他行为扩展的工作原理相同,这意味着您将执行类似的操作(同样,我从未这样做过,但这应该可以让您开始;另请参阅行为扩展机制背后的更多详细信息):

  • 实现一个扩展,该扩展实现了
    IWsdlExportExtension
    IEndpointBehavior
  • 实现一个可以进入配置文件的行为扩展元素
  • 通过将该端点行为扩展添加到配置文件中的system.serviceModel/extensions/behaviorExtensions元素来注册该端点行为扩展
  • 将新扩展添加到端点的行为
e、 g:

公共类LbWsdl:IWsdlExportExtension,IEndpointBehavior
{
public void ExportContract(WsdlExporter exporter,WsdlContractConversionContext上下文)
{
//在这里修复WSDL
}
}
公共类LbWsdlExtension:BehaviorExtensionElement
{
公共重写类型BehaviorType
{
获取{return typeof(LbWsdl);}
}
}

在不完全了解您的配置/环境的情况下,我将建议一些可能有助于您解决问题的选项:

  • 在服务中同时提供http和https基地址 仅通过https配置和启用元数据“”
  • 实现一个单独的mex端点(而不是使用serviceMetadata),这允许对元数据端点进行更多的控制(即不同的
    地址
    和/或
    列表
  • 使用
    System.ServiceModel.Description.IWsdlExportExtension
    控制呈现的服务元数据
参考文献:



此链接有更合适的答案:
public class LbWsdl : IWsdlExportExtension, IEndpointBehavior
{
    public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
    {
        // Fix WSDL here
    }
}

public class LbWsdlExtension : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get { return typeof(LbWsdl); }
    }
}

<system.serviceModel>
  <extensions>
    <behaviorExtensions>
      <add name="lbWsdl" type="LbWsdlExtensions.LbWsdlExtension,LbWsdlExtension />
    </behaviorExtensions>
  </extensions>
  <behaviors>
    <endpointBehaviors>
      <behavior name="LoadBalancedBehavior">
        <webHttp/>
        <lbWsdl />
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>