WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇]

简介:

[WS标准篇]中我花了很大的篇幅介绍了WS-MEX以及与它相关的WS规范:WS-Policy、WS-Transfer和WSDL,因为WCF元数据结构体系完全是基于WS-MEX等相关的规范之上。熟悉这些基本的WS规范,对于我们全面、深刻的理解WCF整个元数据架构体系具有十分重要的意义。不仅仅是针对元数据,对于后续章节陆续要介绍的内容,比如事务、可靠会话、安全等,我强烈建议读者在正式进行相关部分的学习之前,先对相关的WS规范作一个大致的了解。

通过对WS-MEX的介绍,我们知道:不论是采用WS-Transfer Get操作还是Get Metadata操作,获取到的元数据被封装到回复消息主体部分的<Metadata>结点中,而<Metadata>是一组<MetadataSection>元素的集合。在托管的世界里,<MetadataSection>元素和<MetadataSection>元素集合有相应的类型来表示,那就是我们接下来要着重介绍的MetadataSectionMetadataSet

一、MetadataSection

MetadataSection定义在System.ServiceModel.Description命名空间下,用于用于定义基于某种方言(Dialect)的元数据,该类型和WS-MEX中包含元数据SOAP消息主体的<MetadataSection>结点相匹配。我们不妨现在看看MetadataSection的定义:

   1: [XmlRoot(ElementName="MetadataSection", Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
   2: public class MetadataSection
   3: {    
   4:     //其他成员
   5:     public MetadataSection();
   6:     public MetadataSection(string dialect, string identifier, object metadata);   
   7:    
   8:     [XmlAnyAttribute]
   9:     public Collection<XmlAttribute> Attributes { get; }
  10:     [XmlAttribute]
  11:     public string Dialect { get; set; }
  12:     [XmlAttribute]
  13:     public string Identifier { get; set; }
  14:     [XmlElement("Location", typeof(MetadataLocation), Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
  15:     [XmlElement("MetadataReference", typeof(MetadataReference), Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
  16:     [XmlElement("Metadata", typeof(MetadataSet), Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
  17:     [XmlElement("schema", typeof(XmlSchema), Namespace = "http://www.w3.org/2001/XMLSchema")]
  18:     [XmlElement("definitions", typeof(ServiceDescription), Namespace = "http://schemas.xmlsoap.org/wsdl/")]
  19:     [XmlAnyElement]
  20:     public object Metadata { get; set; }   
  21:  
  22:     //四种预定义元数据方言(Dialect)
  23:     //MEX:http://schemas.xmlsoap.org/ws/2004/09/mex
  24:     public static string MetadataExchangeDialect { get; }
  25:     //WS-Policy:http://schemas.xmlsoap.org/ws/2004/09/policy
  26:     public static string PolicyDialect { get; }
  27:     //WSDL:http://schemas.xmlsoap.org/wsdl/
  28:     public static string ServiceDescriptionDialect { get; }
  29:     //XML Schema:http://www.w3.org/2001/XMLSchema
  30:     public static string XmlSchemaDialect { get; } 
  31: }

但看MetadataSection的定义,你可能觉得没有太多值得关注的地方,如果结合WS-MEX规范,既有很多值得玩味的地方了:

首先,在类型上应用了一个XmlRootAttribute特性,并定义的名称和命名空间分别为:MetadataSection和http://schemas.xmlsoap.org/ws/2004/09/mex。这和WS-MEX 1.1完全吻合。

其次,属性Dialect表述元数据方言,你可以定义任意字符串作为其属性值。在WS-MEX定义了五种预定义元数据方言:MEX、XML Schema、WSDL、WS-Policy和WS-Policy Attachment。除了WS-Policy Attachement,MetadataSection为前面四种定义了静态只读属性,以便方面编程使用。

然后,属性Identifier表示元数据的标识符,这是一个以URI形式表示的字符串,由于受篇幅所限,在上面对WS-MEX的介绍中并没有提及,有兴趣的读者可以参考WS-MEX官方文档的第4部分。Identifier和Dialect最终被序列化后生成<MetadataSection>元素相应的属性(Attribute)。此外,MetadataSection还定义了类型为Collection<XmlAttribute>的Attributes属性,你可以自定义任意的XML属性,最终将会作为<MetadataSection>元素的属性。

而元数据的内容通过包含在属性Metadata中,当整个MetadataSection被序列化后,该属性的值将会被序列化成一个XML元素,其元素的名称和命名空间根据具体的类型决定。从应用在该属性上的一系列XmlElementAttribute特性我们可以看出:MetadataSection为以下几种特殊的类型定义了相应的名称和命名空间:

MetadataLocation

MetadataLocation表示以RUI形式表示的元数据文档的地址,WS-MEX 1.1规定了可以采用元数据文档地址的URI来替代相应元数据的内容。MetadataLocation定义在System.ServiceModel.Description命名空间下,定义如下:

   1: [XmlRoot(ElementName="Location", Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
   2: public class MetadataLocation
   3: {
   4:     public MetadataLocation();
   5:     public MetadataLocation(string location);
   6:  
   7:     [XmlText]
   8:     public string Location { get; set; }
   9: }

MetadataReference

按照WS-Addressing 2004或者WS-Addressing 1.0规范,如果元数据成为一种可被寻址的资源(Addressable Resource),那么可以通过终结点引用(Endpoint Reference)的方式来定位该资源。WS-MEX 1.1规定了可以采用元数据终结点引用来替代相应元数据的内容。元数据终结点引用可以通过MetadataReference来表示,MetadataReference定义于System.ServiceModel.Description命名空间下,定义如下:

   1: [XmlRoot(ElementName = "MetadataReference", Namespace = "http://schemas.xmlsoap.org/ws/2004/09/mex")]
   2: public class MetadataReference : IXmlSerializable
   3: {
   4:    
   5:     public MetadataReference();
   6:     public MetadataReference(EndpointAddress address, AddressingVersion addressVersion);  
   7:     public EndpointAddress Address { get; set; }
   8:     public AddressingVersion AddressVersion { get; set; }
   9: }

MetadataSet

MetadataSet就是我们即将要介绍的用于表示MetadataSection集合,将MetadataSet作为MetadataSection的元数据,意味元数据可以以一种嵌套的形式来表示。

XmlSchema

如果元数据的类型为XmlSchema,即表示以XML Schema方言(Dialect)表示的元数据。

ServiceDescription

关于这里的ServiceDescription,读者千万要注意:这里指的是System.Web.Services.Description.ServiceDescription,而不是System.ServiceModel.Description.ServiceDescription。后者是我们熟悉的对WCF服务的描述(对此不熟悉的读者,可以参考《WCF技术剖析(卷1)》的第7章),前者实际上是对一个WSDL文档的描述。由于WSDL的结构相对复杂,ServiceDescription的定义也不太简单,篇幅所限,本书不会对此作详细的介绍,有兴趣的读者可以参考MSDN类库。如果元数据的类型为ServiceDescription,即表示以WSDL方言(Dialect)表示的元数据。

最后,MetadataSection还定义了如下三个静态方法帮助你快速创建基于WS-Policy策略、XML Schema和WSDL元数据方言的MetadataSection对象:

   1: [XmlRoot(ElementName="MetadataSection", Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
   2: public class MetadataSection
   3: {
   4:    //其他成员
   5:     public static MetadataSection CreateFromPolicy(XmlElement policy, string identifier);
   6:     public static MetadataSection CreateFromSchema(XmlSchema schema);
   7:     public static MetadataSection CreateFromServiceDescription(ServiceDescription serviceDescription);
   8: }

二、 MetdataSet

MetadataSet是WS-MEX 1.1中置于SOAP消息主体部分整个元数据的描述,即对置于SOAP主体部分的<Metadata>所有内容的体现。既然<Metadata>结点是一组<MetadataSection>元素的集合,MetadataSet相应地也就是一组MetadataSection对象的集合,这可以从MetadataSet的定义看出来:

   1: [XmlRoot("Metadata", Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
   2: public class MetadataSet : IXmlSerializable
   3: {
   4:     //其他成员
   5:     public MetadataSet();
   6:     public MetadataSet(IEnumerable<MetadataSection> sections);
   7:  
   8:     [XmlAnyAttribute]
   9:     public Collection<XmlAttribute> Attributes { get; }
  10:     [XmlElement("MetadataSection", Namespace="http://schemas.xmlsoap.org/ws/2004/09/mex")]
  11: public Collection<MetadataSection> MetadataSections { get; }
  12:  
  13:     XmlSchema IXmlSerializable.GetSchema();
  14:     void IXmlSerializable.ReadXml(XmlReader reader);
  15:     void IXmlSerializable.WriteXml(XmlWriter writer);
  16: }

三、WCF元数据架构模型

WCF通过终结点的形式将某个服务暴露出来,而元数据的目的在于帮助服务的消费者如何有效地与该终结点进行交互,以实现对该服务的正常调用。元数据帮助像SvcUtil.exe这样的代码生成工具能够有效地生成客户端代码和配置。WCF在内部构建了一个完善的元数据架构体系,很好地实现了元数据的导出、发布、获取和导入,这个框架体系对元数据的处理大体如图1所示。

image 图1 WCF元数据架构体系

图1可以看出,整个元数据框架体系大体分成服务端体系和客户端体系,服务端复杂元数据的导出和发布,客户端实现元数据的获取与导入。元数据的导出、发布、获取和导入这4个基本操作在整个框架体系中的分别实现以下的功能:

在后续的文章中,的我们将针对上述的四个元数据基本操作,对WCF的元数据框架的实现原理进行深入地剖析。


作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
7天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
41 3
|
2天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
4天前
|
存储 分布式计算 分布式数据库
风险数据集市整体架构及技术实现
【11月更文挑战第11天】在当今大数据时代,风险数据集市作为金融机构的核心基础设施之一,扮演着至关重要的角色。它不仅为银行、保险等金融机构提供了全面、准确的风险数据支持,还帮助这些机构实现了风险管理的精细化和智能化。本文将深入探讨一种基于大数据Lambda架构设计的风险数据集市整体架构,并详细介绍其底层实现原理及实现方式。
15 3
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
8天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
1月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
70 2
|
5天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
7天前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
24 3
|
8天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
43 4
|
7天前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
22 2
下一篇
无影云桌面