C# WCF服务web.config调整以更改生成的wdl
我的wcf服务遵循以下负载平衡结构: 公共(https)->F5LB(http)->node1/node2 我在http方案上公开服务,F5LB负责ssl卸载。由于我的服务公开为http,因此通过F5 LB生成的wsdl包含基于http的url,如下所示: 我的LB服务URL: 生成的服务页面为: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
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元素来注册该端点行为扩展
- 将新扩展添加到端点的行为
公共类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>