快速入门系列--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从一个源对象提取一些信息,并将这些信 ...
随机推荐
- Android volley 当用fiddler2 抓包时隔一段时间不操作,会出现 http 408错误
出现原因是由于fiddler2导致,关闭fiddler2即可...
- C# 实现 任意多边形切割折线算法
1. 内容简介 本文旨在解决任意多边形切割折线,获取切割之后的折线集合. 本文实现的算法内容包括:判断两条线段是否相交,如若相交,获取交点集合.对线上的点集,按斜率方向排序.判断点是否在多边形内 ...
- [UCSD白板题] The Last Digit of a Large Fibonacci Number
Problem Introduction The Fibonacci numbers are defined as follows: \(F_0=0\), \(F_1=1\),and \(F_i=F_ ...
- windows 7下qtcreator里QWT文件的pro配置
http://blog.chinaunix.net/uid-20717410-id-272331.html 把编译好的qwt的include文件夹下面 所有的.h文件 复制到qt目录下 然后在pro里 ...
- php 用户ip的获取
$_SERVER 这个变量我很喜欢,里面有很多服务器和用户的配置.资料.特别是在获取用户ip 的时候 直接$_SERVER['REMOTE_ADDR'] 就可以或许,但这是没有使用 反向代理服务器的情 ...
- 用Yaml文件进行元素管理【转】
原文:http://www.cnblogs.com/milanmi/p/4636503.html 如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要 ...
- hdu 5661 Claris and XOR
Claris and XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- JS中innerHTML,innerText,value
一·.JS初学者易混淆的问题:innerHTML,innerText,value(他们和JQ的区别:JS→value,JQ→value()) 1.getElementById("a" ...
- C#设置打开新窗口的位置
C#打开窗口的位置的位置设置 引入命名空间using System.Drawing; 一.如果是打开在显示器正中间则很简单: Form对象.StartPosition = FormStartPosit ...
- Asp.net vnext的IIS部署
微软前段时间推出asp.net vnext,自个也尝试了一把,也写了几篇关于vnext特性的博客,如下. 但一直有个困扰的问题,asp.net vnext如何在iis部署,因为整个目录结构跟之前有了很 ...