专栏首页熊二哥快速入门系列--WCF--04元数据和异常处理

快速入门系列--WCF--04元数据和异常处理

本章节将进行元数据和异常处理的介绍,这部分内容概念型比较强,可以快速浏览一下就好。

客户端和服务器借助于终结点进行通信,服务的提供者通过一个或者多个终结点将服务发布出来,服务的消费者则通过创建与之匹配的终结点进行服务的调用。可以将服务的元数据看做是它所有终结点的描述,它以一种易于交换的数据格式(WSDL, XSD, WS-POLICY)描述该服务的所有终结点信息。WCF提供了一个完整的元数据架构体系,易于元数据的导出、发布、获取和导入。

服务的元数据实际上是对其所具有的终结点的描述,终结点由地址、绑定和契约三要素组成。地址决定了服务的位置并实现相应的寻址机制,契约描述了消息交换模式及消息的结构,绑定则通过创建信道栈实现对消息的编码、传输和基于某些特殊的功能对详细消息进行相应的处理。

WCF是基于SOA的分布式通信平台,而SOA的一个重要特性就是实现跨平台互操作性,元数据本身采用开放的标准,包括:XSD,通过XML Schema的形式描述消息;WSDL,通过一个完成的WSDL文档对服务进行全面的描述;WS-Policy策略,通过WS-Policy规范以断言的形式对服务能力和特性进行描述。接下来,简要的介绍WS-MEX这一进行元数据交换的WS规范。

WS-Policy:提供与业务无关行为和能力的标准,比如事务流转、可靠消息传输和传输安全等。

WS-Transfer:对可寻址的Web服务资源的基本操作提供统一的规范,比如通过Get,Put,Delete和Create操作Web资源。

WSDL:其将web服务定义为一组终结点的集合,而每个终结点包含一系列基于消息的操作。其内容主要包含5大子元素:Type,哦那个过XSD表示的数据类型; Message,通信数据的载体;PortType, 服务操作的集合;Binding,消息、操作与协议、格式的绑定;Service,相关终结点的集合

对于WS-MEX来说,获取的元数据均是封装到回复消息主题部分<Metadata>节点中,其是<MetadataSection>的集合,接下来通过一个图表来了解Metadata和MetadataSection与三种典型的元数据方言之间的关系。

WCF元数据架构模型:WCF通过终结点的形式将某个服务暴露出来,而元数据可以帮助服务的消费者有效的与该终结点进行交互,以实现对该服务的正常调用。其帮助像SvcUtil.exe这样的代码生成工具有效的生成客户端代码和配置,其整体结构如下图所示。

元数据导出:将WCF服务相关的终结点列表转换成MetadataSet对象,元数据的导出通过System.ServiceModel.Description.MetadataExporter实现。

元数据发布:将导出的MetadataSet对象转换为可被寻址的元数据资源,通过相关的协议发布出来,WS-MEX和HTTP-GET是两种常见的协议,元数据的发布通过System.ServiceModel.Description.ServiceMetadataBehavior服务行为实现。

元数据获取:通过相关协议(WS-MEX或者HTTP-GET)获取发布出来的元数据资源,并转换成MetadataSet对象。元数据的获取通过System,ServiceModel.Description.MetadataExchangeClient实现。

元数据导入:将获取的元数据资源生成的MetadataSet对象最终转换为终结点对象,通过System.ServiceModel.Description.MetadataImporter实现。

该部分主要涉及WCF提供的异常处理模型和对WCF异常处理底层实现的分析,包括异常的序列化和反序列化、异常的传播、异常的屏蔽等。对于非分布式的单进程应用,异常处理无非就是简单的抛出异常和捕获异常而已。但是WCF结局的是相关系统之间的互联,互联系统之间需要跨进程、跨及其以至于跨网络的交互,异常处理就变得相对复杂,包含了如下要素。

异常的封送(Exception Marshaling):服务端抛出的异常如何进行序列化以便能够传递到客户端。

敏感信息的屏蔽(Sensitive Information Shielding):抛出的异常常常包含敏感信息,直接将服务操作执行过程抛出的异常直接返回客户端,存在较大安全隐患。

系统的集成和互操作:基于不同厂商和技术平台系统之间的有效继承和互操作也给异常处理提出了新的要求,要求异常消息的标准化。

默认情况下,如果异常在执行服务操作过程中抛出,其真正的异常细节信息仅限于服务端可见,在Debug阶段,可以通过如下设置发送详细异常信息。

 1 <system.serviceModel>
 2 <behaviors>
 3 <serviceBehaviors>
 4 <behavior name="serviceDebugBehavior">
 5 <serviceDebug includeExceptionDetailInFaults="true"/>
 6 </behavior>
 7 </serviceBehaviors>
 8 </behaviors>
 9 <services>
10 <service behaviorConfiguration="serviceDebugBehavior"></service>
11 </services>
12 </system.serviceModel>

也可以通过设置[ServiceBehavior(IncludeExceptionDetailInFaults=true)]特性的方式来解决。

在WCF中,所有的异常信息都是通过FaultException类来传播的,可以通过其泛型参数<TDetail>来传播自定义的信息。在契约中,可以通过设置FaultContractAttribute中的相关属性来实现,属性包括:Action, DetailType, Name&Namespace, HasProtection&ProtectionLevel。

和之前的章节提到Message用于传播SOAP消息之外,对于异常信息,WCF通过FaultMessage对象来传播,其对象包括如下属性:Code,表示错误代码;Reason,表示错误原因;Node,表示导致出错的SOAP节点;Role表示SOAP节点对应的角色;Detail表示错误的详细描述。

WCF并不直接进行FaultException异常和错误消息之间的交换,其通过一个System.ServiceModel.Channels.MessageFault对象来完成,此外消息的格式化通过FaultFormatter来完成。由于EHAB的继承使用并不方便,因此就不进行介绍了。

参考资料:

[1]蒋金楠. WCF全面解析[M]. 上海:电子工业出版社, 2012.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速入门系列--MVC--01概述

    虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入。其实就在MVC框架中有很多设计模式和设计思路的体现,例如Depende...

    用户1216676
  • Html与CSS快速入门03-CSS基础应用

    这部分是html细节知识的学习。 ? ? 边框、填充、对齐和浮动 这部分将主要介绍使用CSS控制整个Web页面的各个方面,通常来说,会使用margin(外部)...

    用户1216676
  • 项目管理深入理解08--成本管理

    成本管理一章非常的重要,尤其是对于程序员来说,这方面非常的薄弱,但这部分知识无论是在项目管理中还是日常生活中都灰常重要,不然很难成为一个财务自由的程序员。此外,...

    用户1216676
  • 协力抗疫,码力 全开” 线上黑客马拉松 + 60 + 你说的都队 + 飞机大战病毒

    疫情爆发,物资紧张,社会需要大量口罩物资,玩家射击病毒,收获口罩,以保护自己不受病毒侵袭。

    用户6682751
  • React通过jsonp来请求接口获取数据渲染数据

    Fetch-jsonp https://github.com/camsong/fetch-jsonp

    祈澈菇凉
  • 001.LVM简介

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现。LVM将一个或...

    木二
  • SpringMVC中的事务和异常

    所以我们service层在添加了try catch日志打印后,抛出的runtime类异常需要在controller层进行捕获,捕获之后,在catch中编写操作失...

    剑行者
  • 一个二本大佬的成长之路

    我既没有跨过山和大海,也没有穿过人山人海,我就是我,一个2020届普通本科大学生。身为读者的你,关注了我,自然是想获取知识与经验,我所能分享的,也只有我...

    Java3y
  • 再说swift namespace

    之前写过namespace的问题不过后续都是没怎么使用,时下rx,snp…大家都应经不再陌生,也是比较常见的,今天我们结合struct 泛型 class一起看个...

    大话swift
  • 腾讯云 Elasticsearch 实战篇(二十一) 如何选择合适的ES存储集群?

    通过我们前面的ELK学习,我们已经深入了解了ELK的相关知识以及腾讯云Elasticsearch 的操作与维护,那么,在实际生产应用中,我们如何根据企业...

    南非骆驼漫谈ELK Stack

扫码关注云+社区

领取腾讯云代金券