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

本文关键字:wdl 服务 web config 调整 WCF | 更新日期: 2023-09-27 18:30:24

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

public (https) ->

F5 LB (http) -> node1/node2.

我正在 HTTP 方案上公开服务,F5 LB

负责 SSL 卸载。 由于我的服务公开为 HTTP,因此通过 F5 LB 生成的 WSDL 包含基于 HTTP 的 URL,如下所示:

我的LB服务网址:

https://myservice.mydomain.com/service1.svc

生成的服务页面为:

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。 由于 F5 LB 将服务公开为 HTTPS,因此它不允许上述 HTTP URL,并且来自客户端的请求正在反弹。

现在,我们可以调整我的服务 web.config 以在 HTTP 方案上公开服务,但让 WSDL 指向 HTTPS URL,以便从 F5 LB 生成的 wsdl 上方的 URL 也 https 和客户端将在 https 上工作,来自 LB 的请求将在我的服务处理的 http 上提供服务?

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

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

  • 在服务中同时提供 http 和 https 基址仅通过 HTTPS 配置和启用元数据 ''
  • 实现一个单独的 mex 端点(而不是使用 serviceMetadata),它允许对元数据端点进行更多控制(即不同的address和/或listenUri
  • 使用System.ServiceModel.Description.IWsdlExportExtension控制呈现的服务元数据

引用:
WCF
中的 WSDL 和 Mex Endpoint 有什么区别
http://blogs.msdn.com/b/saurabs/archive/2012/04/27/http-get-v-s-mex-end-point.aspxhttp://msdn.microsoft.com/en-us/library/aa717040.aspx

我从未这样做过,但与 WCF 中的大多数内容一样,您可以挂钩到扩展点来覆盖其默认行为。

听起来您需要做的是实现自定义的"元数据"端点。有一系列关于导出自定义元数据的 MSDN 文章。具体来说,您可以实现一种IWsdlExportExtension,该允许您在将 WSDL 数据发送到客户端之前对其进行访问。

这似乎与大多数其他行为扩展的工作方式相同,这意味着你会做这样的事情(同样,我从来没有做过,但这应该让你开始;另请参阅此博客文章以获取行为扩展机制背后的更多详细信息):

  • 实现实现IWsdlExportExtensionIEndpointBehavior的扩展。
  • 实现可以进入配置文件的行为扩展元素
  • 通过将终结点行为扩展添加到配置文件中的 system.serviceModel/extensions/behaviorExtensions 元素来注册该终结点行为扩展
  • 将新扩展添加到终结点的行为中。

例如:

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>