WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
原文: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策略断言了。
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]的更多相关文章
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...
- WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇]
原文:WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇] 在[WS标准篇]中我花了很大的篇幅介绍了WS-MEX以及与它相关的WS规范:WS-Policy.WS-Tra ...
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]
原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
原文:WCF技术剖析之二十: 服务在WCF体系中是如何被描述的? 任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源.同理,一个WCF服务的监听与执行同样需要通过 ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序) 基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetad ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序) 通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配 ...
随机推荐
- Android学习之DragEvent
关于DragEvent Google Android API中是这么说的 Represents an event that is sent out by the system at various t ...
- 自定义cell时,在宽的手机上显示太窄解决办法
1.工程设置要如下:见第二个红框,清除launch screan file 后面的内容 2.自定义的cell要设置auto layout 和size clases
- 字符串分割函数Demo
#include <stdio.h> int getLength(char *string); int main(int argc, char **argv){ char str[12] ...
- mysql存储过程详解[转]
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
- Subsets 【dfs】
Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...
- Qt探秘——谈ui文件的用法
转载自:点击打开链接http://blog.csdn.net/luo_isaiah/article/details/5794973 相信用过Qt Designer的朋友,对Qt Project中的.u ...
- BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
题目 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 553 ...
- 小程序员在android移动应用上的赚钱经历
先说说我自己吧,二线城市(以外包为主)的小程序员,工作多年了,月收入5-6K.主要从事asp.net web网站开发,java,c++,php,ruby都懂一些,属于那种对问题不求甚解型,爱好电脑游戏 ...
- Asp.Netserver控件开发的Grid实现(三)列编辑器
以下是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; usin ...
- ThinkPHP - 图片水印
图片添加水印 可以通过使用Image类的水印方法给图片添加水印支持,例如:water 给图片添加水印 用法 water($source, $water, $savename=null, $alph ...