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 上提供服务?
在不完全了解您的配置/环境的情况下,我将建议一些可以帮助您解决问题的选项:
- 在服务中同时提供 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 数据发送到客户端之前对其进行访问。
这似乎与大多数其他行为扩展的工作方式相同,这意味着你会做这样的事情(同样,我从来没有做过,但这应该让你开始;另请参阅此博客文章以获取行为扩展机制背后的更多详细信息):
- 实现实现
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>