快速入门系列--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阶段,可以通过如下设置发送详细异常信息。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="serviceDebugBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="serviceDebugBehavior"></service>
</services>
</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.
快速入门系列--WCF--04元数据和异常处理的更多相关文章
- 快速入门系列--WebAPI--03框架你值得拥有
接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...
- 快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- vue 快速入门 系列 —— vue-router
其他章节请看: vue 快速入门 系列 Vue Router Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌. 什么是路由 ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
随机推荐
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
- [UCSD白板题] Sorting: 3-Way Partition
Problem Introduction The goal in this problem is to redesign a given implementation of the randomize ...
- angularjs 1.x $q模块使用
什么是$q $q是angularjs1.x中内置服务,在需要使用时可以注入它. angular.module('app').controller('myController', function my ...
- (转)如何为你的Viewcontroller瘦身
View controllers are often the biggest files in iOS projects, and they often contain way more code t ...
- Yii2 性能优化 来源yii2官方文档
优化你的 PHP 环境 使用最新稳定版本的 PHP . PHP 的主要版本可能带来显著的性能提升. 启用字节码缓存 Opcache(PHP 5.5或更高版本) 或 APC (PHP 5.4或更早版本) ...
- Jquery的multifile使用随记
1.多文件上传: 2.如上几个验证不重复,和限制上传数量的验证显示的是英文,改成中文文本时,如果不用国标解码,到时候提示框会出现乱码现象.所以一般需要中文显示的时候,我们应该这样做: 拿denied做 ...
- 如何保证DBContext实例上下文唯一
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using S ...
- SQLSERVER的一个不显眼的功能 备份文件的分割
SQLSERVER的一个不显眼的功能 备份文件的分割 当完整备份数据库的时候,我们有时候可能会遇到一种极端情况,比如服务器上C,D,E三个盘符都只剩下5G空间了 但是如果要完整备份业务库需要12G的空 ...
- libQtCassandra 0.5.0 发布
libQtCassandra 0.5.0 修复了 QCassandraRow::exists() 函数的问题,更新了 Thrift 库. libQtCassandra 是一个高级的 C++ 库用来访问 ...
- 《Linux内核设计与实现》读书笔记 - 目录 (完结)
读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...