快速入门系列--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从一个源对象提取一些信息,并将这些信 ...
随机推荐
- Bootstrap 栅格系统
1.简介 Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义classe,还有强大的m ...
- css小技巧
每逢大的灾难的时候,很多网站变成了灰色,如何让网站快速变灰?css代码是很简单的,用的是css的filter功能. html { filter: grayscale(100%);//IE浏览器 -we ...
- Unity3d中Update()方法的替身
在网上看到一些资料说Unity3d的Update方法是如何如何不好,影响性能.作为一个菜鸟,之前我还觉得挺好用的,完全没用什么影响性能的问题存在.现在发现确实有很大的问题,我习惯把一大堆检测判断放在U ...
- angular2 递归导航菜单实现方式
看了网上很多源码,基本都是采用循环三级的方式.如果是无限级的菜单,就无法实现了. 菜单格式: [ { "title": "Item-1", "icon ...
- Oracle Created (Default) Database Users
http://www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_26.shtml DBA Tips Arch ...
- 在docker里部署网络服务
之前试着玩玩docker有一阵子了,今天算是头一回正式在docker里部署网络服务. 本来想和lxc差不多的东西那自然是手到擒来,没想到还是改了很多. 第一个遇到的问题是,远程连到docker宿主机干 ...
- myrocks记录格式分析
概况 rocksdb作为KV存储引擎,那么myrocks记录最终会以kv的形式存储在rocksdb中.MySQL中的表一般由若干索引组成, 在innodb存储引擎中,每个索引对应一颗B树,而在rock ...
- HTTP协议中POST、GET、HEAD、PUT等请求方法以及一些常见错误
(来源:http://www.tuicool.com/articles/Ermmmyn) HTTP请求方法: 常用方法: Get\Post\Head (1)Get方法. 取回请求URL标志的任何信息, ...
- Restful.Data,现招募有为骚年,群号 338570336
光阴似箭,日月如梭,套用小学作文惯用的一句开场白来开始重新开始我的博客园生涯吧. 8年的风霜雪雨,不断的击打着我内心的哀伤,可我依旧坚挺的屹立在这里,是因为技术是我一直坚持的梦想. 追寻着先辈和高人的 ...
- [后端人员耍前端系列]KnockoutJs篇:使用WebApi+Bootstrap+KnockoutJs打造单页面程序
一.前言 在前一个专题快速介绍了KnockoutJs相关知识点,也写了一些简单例子,希望通过这些例子大家可以快速入门KnockoutJs.为了让大家可以清楚地看到KnockoutJs在实际项目中的应用 ...