前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]

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

作者头像
蒋金楠
发布2018-01-16 15:24:59
5520
发布2018-01-16 15:24:59
举报
文章被收录于专栏:大内老A大内老A大内老A

通过《实现篇》对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策略断言了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2009-12-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、WSDL导出扩展(WSDL Export Extension)
  • 二、策略导出扩展(Policy Export Extension)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档