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[编程篇]>的介绍我们知道了如何可以通过编程或者配 ...
随机推荐
- JavaScript constructor prototyoe
想加深一下自己对construtcor prototype的印象所以写了这一篇文章 对象的constructor 就是Object 除了通过构造函数创建的对象意外 他的constructor 都是 都 ...
- [译]Stairway to Integration Services Level 13 - SSIS 变量回顾
介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...
- 五毛的cocos2d-x学习笔记04-触摸点
Touch position是屏幕坐标系中的点,OpenGL position是cocos2d-x用到的OpenGL坐标系上的点坐标.所以就需要将touch的坐标转换成OpenGL坐标系中的点坐标. ...
- 一个简单链表的C++实现
/* LList.cpp * Author: Qiang Xiao * Time: 2015-07-12 */ #include<iostream> using namespace std ...
- C++中(int&)和(int)的区别
在说这个问题之前,先说两个需要知道的背景知识: (1)语言的类型的强制转换不会修改原来的数据,会另外的开辟一个临时的或者程序中指定的空间来存储强制转换后的值. (2)C++引用的实现是在符号表中动了手 ...
- linux shell awk 流程控制语句(if,for,while,do)详细介绍
在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...
- spoj 3871 gcd extreme
题目大意给出一个n,求sum(gcd(i,j),<i<j<=n); 可以明显的看出来s[n]=s[n-]+f[n]; f[n]=sum(gcd(i,n),<i<n); 现 ...
- qt实现-给SQLITE添加自定义函数
需要使用sqlite里的password对某个字段进行加密,由于使用的sqlite是由QT封装好的QSqlDatabase,没有发现加载扩展函数的方法,所以自己实现了一个. 在网上也没找到相应的参考, ...
- jvm Classload method介绍
1,jvm Classload默认几个重要方法介绍 findClass:Finds and loads the class with the specified name from the URL s ...
- 【Maven】运行项目,报ClassNotFound错误
我们在pom.xml中添加了那些依赖的jar后,一旦在代码中应用.当我们本地调试时,会报ClassNotFound错误,这是为什么?? 因为Tomcat不懂这些配置,你必须把Maven Depende ...