1

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

公共(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 服务?

4

2 回答 2

0

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

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

参考:
WCF 中的 WSDL 和 Mex 端点有什么区别
http://blogs.msdn.com/b/saurabs/archive/2012/04/27/http-get-vs-mex-end-point.aspx
http: //msdn.microsoft.com/en-us/library/aa717040.aspx

于 2014-11-13T12:39:12.557 回答
0

我从未这样做过,但与 WCF 中的大多数事情一样,您可以使用扩展点来覆盖其默认行为。

听起来您需要做的是实现自定义“元数据”端点。MSDN 上有一系列关于Exporting Custom Metadata的文章。具体来说,IWsdlExportExtension您可以实现一个可让您在将 WSDL 数据发送到客户端之前对其进行访问的方法。

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

  • 实现一个实现IWsdlExportExtension和的扩展IEndpointBehavior
  • 实现可以进入配置文件的行为扩展元素
  • 通过将端点行为扩展添加到配置文件中的 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>
于 2014-11-13T12:34:27.023 回答