WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]

通过《实现篇》对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding元素来源于终结点的绑定对象,那么这些基于Binding的元数据以及相应的策略断言是如何被写入WSDL的呢?WSDL导出扩展(WSDL Export Extension)策略导出扩展(Policy Export Extension)就是为此设计的。

一、WSDL导出扩展(WSDL Export Extension)

终结点的绑定本质上就是相关的绑定元素(BindingElement)的有序组合(关于绑定的深入剖析,可以参考《WCF技术剖析(卷1)》第3章),所以基于绑定的WSDL导出扩展通过绑定元素的形式实现。对于需要向最终导出的WSDL添加于Binding相关的元数据的绑定元素,必须实现System.ServiceModel.Description.IWsdlExportExtension接口。

此外,WSDL导出扩展并不限于被相应的绑定元素用于添加Binding相关的元数据,我们也可以采用终结点行为、契约行为和操作行为(服务行为不可以用于WSDL导出扩展)作为WSDL导出扩展实现在最终生成的WSDL中添加自定义的元数据。作为WSDL导出扩展的上述三种行为同样需要实现IWsdlExportExtension接口。

下面的代码片断给出了IWsdlExportExtension接口的定义,该接口定义了两个方法:ExportContract和ExportEndpoint,分别于WsdlExporter的同名方法对应。

   1: public interface IWsdlExportExtension
   2: {
   3:     void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context);
   4:     void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context);
   5: }

WsdlExporter的定义我们知道,无论是调用ExportContract还是ExportEndpoint方法,并不会直接将导出的元数据返回,最终导出的元数据是通过于另外一个额外的方法GetGeneratedMetadata获得的。实际上,当调用WsdlExporter的ExportContract或者ExportEndpoint方法的时候,会将导出的元数据暂存一个基于WsdlExporter对象的上下文(Context)之中。对于ExportContract方法,这个上下文对象是WsdlContractConversionContext,而对于ExportEndpoint方法则是WsdlEndpointConversionContext

在执行ExportContract或者ExportEndpoint方法的最后阶段,会遍历所有实现了IWsdlExportExtension接口的WSDL导出扩展元素(对于ExportContract方法,即所有实现了IWsdlExportExtension接口的3种行为对象;对于ExportEndpoint方法,包括实现了IWsdlExportExtension接口的行为对象和绑定元素),并将WsdlExporter对象本身和相应的上下文对象(WsdlContractConversionContext或者WsdlEndpointConversionContext)作为参数执行WSDL导出扩展的ExportContract方法或者ExportEndpoint方法,最终实现了对将定制的元数据写入最终的WSDL的目的。

WSDL导出扩展并不包含对WS-Policy策略断言的导出,对此的实现定义在另外一个导出扩展中,即策略导出扩展。

二、策略导出扩展(Policy Export Extension)

在《WCF技术剖析(卷1)》的第3章对绑定的介绍中,我们说绝大部分WS规范最终都通过绑定实现,或者说,WCF通过定义相应的绑定元素对某个WS规范提供支持。所以,终结点的绑定包含了很多基于相应WS规范的WS-Policy策略断言需要作为元数据导出到最终生成的WSDL中。比如对于WSHttpBinding,如果采用基于消息的安全模式,需要导出基于WS-Security相关的策略断言;如何开启了可靠会话(Reliable Session),需要导出基于WS-RM(WS-Reliable Messaging)相关的策略断言。在WCF元数据结构体系中,通过策略导出扩展实现对WS-Policy策略断言的导出。

所有需要实现WS-Policy策略断言导出的绑定元素,必须实现System.ServiceModel.Description.IPolicyExportExtension接口。IPolicyExportExtension接口仅仅定义了如下一个方法成员:ExportPolicy。

   1: public interface IPolicyExportExtension
   2: {
   3:     void ExportPolicy(MetadataExporter exporter, PolicyConversionContext context);
   4: }

WsdlExporter执行ExportEndpoint方法的最后阶段,会创建PolicyConversionContext对象。遍历所有实现了IPolicyExportExtension接口的绑定元素,并将WsdlExporter对象本身和该PolicyConversionContext对象对象作为参数调用这些绑定元素的ExportPolicy方法。这些作为策略导出扩展的绑定元素将相应的基于WS-Policy策略的元数据导出到PolicyConversionContext对象中。待所有绑定元素执行完毕,再将暂存于PolicyConversionContext的策略元数据附加到上面提到的WsdlEndpointConversionContext对象上,那么最后导出的元数据就包含了相应的WS-Policy策略断言了。


作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
上一篇:GDB Cypher:Cypher用户的最佳选择


下一篇:从事前到事后,云数据库 Redis & MongoDB 安全体系全揭秘!