WCF全面解析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

“全书之写印,实系初稿。有时公私琐务猬集,每写一句,三搁其笔;有时兴会淋漓,走笔疾书,絮絮不休;有时意趣萧索,执笔木坐,草草而止。每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不离左右。个中甘苦,只自知之。”

在某个阳光明媚的早晨,我在去上班的公交车上翻看岳南先生的《南渡北归》的时候,看到上面这段董作宾描述自己写作《殷历谱》之甘苦的文字,回想起我写作这本书的经历,不禁感慨万千。我无意将《WCF全面解析》自比煌煌巨著《殷历谱》,只是觉得人同此心,这段文字正好描述我写作此书的状态。

《WCF技术剖析(卷1)》(以下称《卷1》)于2009年7月正式出版,在此不久我就开始了《卷2》的创作。对于《卷1》的写作,我还算是游刃有余,但是写作《卷2》的难度是我始料未及的。如果像市面上大部分专著一样只涉及WCF编程,我想《卷2》早在一年之前就已经完成了。但是我在写作之初就没有将本书定位为一本纯粹的WCF编程书籍,而是决心写一本“深入肌理”,对WCF进行“庖丁解牛”式剖析的书籍。在没有任何现成资料可供参考的情况下,我只能通过对源码的分析来了解其底层的实现原理。为了能够确保这部分内容的正确性,我编写了很多的测试程序来证实我的想法。

“探究之深”是本书难以在较短的时间之内交付出版的一个主要原因,而另一个因素则是“涉及之广”。WCF不是微软在Windows平台下的闭门造车,而是在设计之初就考虑到了针对开放标准的支持。《卷2》涉及到太多的WS-*规范,比如“异常处理”一章涉及到SOAP;“元数据”一章涉及到WS-Policy、WS-Transfer、WS-MEX和WSDL; “事务”一章涉及到WS-Coordination和WS-AT; “可靠会话”一章涉及到WS-RM; “传输安全”一章涉及到WS-Security、WS-Trust 、WS-Secure Conversation和WS-Security Policy; “WCF 4.0新特性”一章涉及到WS-Discovery。对于这一系列的WS-*规范,单单从头到尾看一遍都需要花费不少时间,而我已经不太记得自己究竟看多少遍了。

《卷1》的整个内容基本上都围绕着WCF本身,但《卷2》却涉及到不少的背景知识。为了让读者对WCF有一个全面而深刻的了解,我在书中涉及到很多背景知识的介绍。比如“事务”一章中花费了很多文字介绍MSDTC和System.Transactions事务;“并发与限流”一章中有针对同步上下文的介绍;为了让读者能够深入认识可靠会话的实现原理,我将其同TCP协议的机制进行类比;“队列服务”一章中对MSMQ进行了系统的介绍;“传输安全”一章中更是涉及到针对非对称加密以及NTLM和Kerberos认证原理的介绍。

由于写作难度不小,加上写作和资料收集只能在工作之余进行,所以很多次都有中途放弃的念头。很有意思的是,每次在我下定决心放弃写作后没几天总是会收到《卷1》的读者给我的留言,这些留言体现了对《卷1》的肯定,充满了对《卷2》的期待。读者的肯定和期待一次次给了我坚持下去的力量,前后经历了两年的时间终于完成了《卷2》,这算是对读者的交代,也是对我自己的交代。

《卷2》完稿之后我开始为《卷1》的再版进行修订。对于出版后的《卷1》我基本上很少翻看,因为我个人基本上不太喜欢翻看自己写的东西,包括自己写的400多篇博客文章。针对《卷1》的修订让我第一次完整地阅读自己写的东西,经过了写作《卷2》的“折磨”,让我对WCF有了更加深刻的认识,于是我基于对WCF最新的理解开始对《卷1》的内容进行大刀阔斧的修改。虽然《卷1》大体上还是保留着原来的结构,但是内容已经发生了巨大的改变。据我粗略估计,改动内容的比率基本上达到一半。

最后我将《卷2》和修订后的《卷1》给李建忠和吕建伟(阿朱)老师帮忙审阅,李建忠老师建议增加关于WCF REST的内容,于是我在《卷1》中新加了“REST服务”一章。由于新的《卷1》已经难现往日模样,在本书的策划编辑张春雨老师的建议下我决定将原《卷1》和《卷2》作为一个整体分上、下册出版,于是才有了你手中的这本《WCF全面解析》。

本书特点

如果要说出《WCF全面解析》具有哪些市面上其他WCF图书不具备的特点的话,我觉得可以通过以下三个“注重”来概括。

注重原理

“知其然,且知其所以然”,对一项技术实现原理的把握能够帮助你更加有效地利用这项技术。WCF建立在.NET平台下,提供基于托管代码的应用编程接口(API),在编程层面不会太复杂,也很容易入手。但是如果希望通过WCF构建一个具有高性能、高可维护性、高可扩展性的分布式应用,就要求架构师、设计师和开发者对WCF的实现机制,以及面向服务的设计原理具有正确、全面而深入的理解。当然,对于WCF编程的介绍对于任何一本关于WCF的图书都是必需的,《WCF全面解析》也不例外,不过它和那些完全介绍WCF编程的书不同的是,本书中此类内容仅占全部内容的一半左右。

注重细节

“细节决定成败”,如果将2/8原则应用到编程领域,它将体现在:花20%的时间编写出80%程序主体,而80%的时间用于编写剩下20%核心程序并纠错和解决Bug。这些Bug的产生往往是由于对细节不够重视所导致的。《WCF全面解析》会介绍一些常被人们忽视而导致产品Bug的细节,这些细节多源自于我这些年来实践的积累和总结。

注重实践

“实践出真知”,不断地在具体应用中进行实践是学习WCF最有效的手段。实践是检验真理的唯一标准,通过将所学的WCF知识应用到一个真正的应用之中,才能确保我们掌握的知识的正确性。实践不但可以巩固我们的所学,还会让我们意识到不足。《WCF全面解析》在每一章节都会提供一系列的实例演示,读者可以单独下载这163个实例的源代码。

本书读者

本书的内容不仅适合尚未接触过WCF,希望尽快入门并进行深入研究的开发人员,同样适合对WCF具有一定了解的开发设计人员和架构师。相信不同层次的读者都能从本书中找到自己希望了解的部分。阅读本书的读者需要对.NET,包括对C#和.NET Framework具有一定的了解。如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ及SOA相关的基础,对阅读此书尽快掌握WCF将大有裨益。

本书结构

(上册)

第1章 WCF简介(WCF Overview)

本章简单讲述了WCF产生的历史背景,以及在微软产品线中所处的地位。为了使读者对基于WCF的编程模型有一个直观的印象,我们将带领读者创建一个完整的WCF应用。本章实例应用涵盖了构建一个基本WCF应用所需的所有步骤,包括服务契约的定义、服务的实现、服务的寄宿、元数据的发布和导入、服务代理的创建和服务调用等。

第2章 地址(Address)

作为终结点三要素之一的地址在WCF应用编程接口中通过EndpointAddress表示,本章会从编程的角度对该类型进行详细的介绍。端口共享对于WCF服务的部署具有重要的意义,我们会分别介绍基于不同传输协议(HTTP/HTTPS和TCP)的端口共享机制在WCF中是如何实现的。终结点地址具有逻辑地址和物理地址之分,本章会详细讲述如何在客户端和服务端实现两者的分离。在本章的最后会对请求监听和消息分发机制进行深入解析。

第3章 绑定(Binding)

WCF整个框架大体分为服务模型层和信道层,作为终结点三要素之一的绑定是整个信道层的缔造者。为了全景展示整个绑定模型,涉及到的对象包括绑定元素、信道监听器、信道工厂、信道等。绑定本质上是一系列相关绑定元素的有序组合,我们将从绑定元素的构成来分析常见系统绑定的本质区别,以及通过绑定元素重组来创建自定义绑定。

第4章 契约(Contract)

契约是组成终结点的第三个元素,本章会从编程和服务描述的角度系统地介绍服务契约。组成服务契约的操作表示基于某种模式的消息交换和消息本身的结构,本章会着重介绍基于三种消息交换模式的契约操作之间的差异,以及如何编程实现对客户端的回调。多线程在服务调用中具有普遍的意义,我们会全方面地介绍多种不同的异步调用方法在WCF中的实现。在本章的结尾,我们会详细讨论操作选择和执行机制。

第5章 序列化(Serialization)

序列化/反序列化最终通过XmlSerializer和DataContractSerializer这两个序列化器来实现,我们会详细介绍它们参与序列化和反序列化采用的序列化规则。数据契约是WCF中定义数据的主要方式,本章会着重介绍如何通过DataContractAttribute和DataMemberAttribute这两个特性来定义数据契约。确定对象的类型是保证序列化/反序列化成功的先决条件,我们会系统地介绍如何通过“已知类型”让某些类型成为序列化器预先知道的类型。基于集合和泛型类型的数据契约比较特殊,我们会在专门的一节对它们进行详细介绍。本章的最后会讲述数据契约等效性的概念,以及针对请求消息和回复消息的序列化/反序列化在WCF中是如何实现的。

第6章 消息(Message)

消息是通信的载体,本章专门介绍关于消息的话题。我们首先会通过对SOAP的介绍让读者知道一个标准的消息应该具有怎样的结构。在WCF的应用编程接口中,消息通过类型System.ServiceModel.Channels.Message表示,我们会针对该类型来介绍基于消息的基本操作和状态机。除了消息主体外,我们可以通过消息报头和消息属性来携带额外的控制信息,本章会详细讲述消息报头和消息属性是如何添加和读取的。消息契约可以将某个类型的属性/字段分别定义成消息的主体成员和报头成员,我们会系统地介绍基于消息契约的编程。本章以消息编码作为结尾,通过介绍我们可以知道消息在发送前的编码和接收后的解码在WCF中是如何实现的。

第7章 服务寄宿(Hosting)

我们通过宿主应用程序来承载服务旨在为服务提供一个运行环境。服务契约通过ServiceHost来实现,以终结点为核心的服务描述是创建ServiceHost的基础,所以本章的开始会对服务描述进行系统的介绍。IIS/WAS寄宿是我们常用的服务寄宿方式,为了深刻地理解背后的运行机制,我们对不同版本的IIS和ASP.NET管道进行了详细介绍。而IIS/WAS寄宿具有ASP.NET兼容模式和并行模式之分,本章将从实现原理的角度深入剖析两者的差别。我们将针对Windows服务的服务寄宿方式放在本章的结尾进行介绍。

第8章 客户端(Client)

我们通过服务代理进行服务调用,而服务代理可以直接通过ChannelFactory<TChannel>来创建,也可以通过导入服务元数据的方法直接生成继承自ClientBase<TChannel>的服务代理类。本章会详细讲述ChannelFactory<TChannel>和ClientBase<TChannel>。通过本章的介绍我们会知道,从ChannelFactory<TChannel>被创建到被开启,再到通过ChannelFactory<TChannel>创建服务代理,最后将服务代理开启并进行服务调用的各个阶段WCF在背后都为我们做了什么。

第9章 实例化与会话(Instancing and Session)

实例化和会话是WCF中两个重要的概念,前者旨在实现服务实例对象的激活,后者则实现对客户端调用状态的保持。本章将详细介绍三种典型的实例化模式所表现的行为、实现的原理及各自适合的场景。在介绍会话的部分会深入剖析会话如何保持客户端多次服务调用的状态,以及会话、实例化模式、绑定和信道之间的关系。

第10章 REST服务(REST Service)

REST是直接建立在Web上的一种面向资源的软件架构风格,WCF通过Web HTTP编程模型对REST提供了很好的支持。本章会系统地讲述组成Web HTTP编程模型的重要类型和组件。URI模板是WCF REST的一个重要的概念,读者通过本章的介绍不仅会了解定义URI模板的基本语法,还会对基于URI模板的操作选择机制有一个深刻的理解。较之SOAP, WCF REST采用更为复杂的消息格式化机制,本章通过对消息格式化的介绍让读者明白不同消息格式和主体风格的消息是如何格式化的。输出缓存、条件获取和条件更新的介绍被放在本章的最后部分。

第11章 WCF实例研究(WCF in Practice)

本章通过一个简单的电子商务网站VideoMall指导读者如何利用WCF构建一个完整的分布式应用。本实例不仅会体现WCF的基本编程方式,还会涉及一些软件架构和设计方面的介绍,比如模块化、分层、IoC和AOP等。本实例还体现了很多针对WCF的扩展,比如通过扩展实现了与Unity、EntLib的集成。

(下册)

第1章 异常处理(Exception Handling)

本章首先会对WCF基本异常处理模式进行介绍,读者借此会了解到如何进行异常的抛出与捕获,异常详细信息如何传递,以及错误契约该如何定义。异常和消息是错误信息的两种不同的载体,我们会详细介绍通过两种不同形式承载的错误信息是如何进行转换的。WCF的扩展性在异常处理方面具有较好的体现,本章的最后部分会通过实例演示的方式讲述基于自定义ErrorHandler的异常处理扩展。

第2章 元数据(Metadata)

用于描述服务的元数据帮助客户端创建匹配的终结点进行服务调用,WCF具有一个完整的元数据体系实现元数据的导出、发布、获取和导入,本章会从这4个方面来深入剖析整个元数据架构体系。不论是元数据本身还是元数据的发布,都不是微软在Windows平台内部的闭门造车,而是遵循一系列的开放标准,这些标准包括WS-Policy、WS-Transfer、WSDL和WS-MEX等,本章同样会涉及到对这些WS-*规范的介绍。

第3章 事务(Transaction)

基于WCF的分布式事务直接建立在现有的Windows事务管理体系之上,本章会对该事务处理模型进行详细的介绍。WCF事务具有OleTx和WS-AT两个基本协议,我们会对WS-AT以及相关的WS-Coordination规范进行相应的介绍。在针对事务编程模型的介绍中,我们会了解到如何通过服务契约定义事务流转的策略,如何通过对绑定的设置实现事务的流转,以及如何控制事务相关的行为。在本章的最后,我们会详细讲述事务流转和事务自动登记在WCF框架体系中是如何实现的。

第4章 并发与限流(Concurrency and Throttling)

并发指的是针对同一个封装服务实例的实例上下文的并行调用,WCF具有Single、Multiple和Reentrant三种基本的并发模式,本章会详细讲述基于不同实例化方式的Single和Reentrant并发模式是如何实现的。线程的亲和性表示针对服务调用请求的处理与服务寄宿时的同步上下文的绑定,本章会详细介绍线程的亲和性是如何产生的,以及如何解除线程的亲和性。限流旨在控制相应的并发量以实现对资源的合理使用,进而确保服务的可用性,在本章的最后部分我们会详细讲述如何设置三个限流阈值,以及限流机制的实现原理。

第5章 可靠会话(Reliable Sessions)

可靠会话通过消息确认和超时重传机制保证了通信的可靠性,实现了消息的接收保障、重复筛选和有序交付。可靠会话是对WS-RM的实现,本章的开始会进行关于WS-RM的相关介绍。可靠会话仅仅涉及到绑定,我们会通过实例演示的方式来介绍围绕着绑定的可靠会话编程模型。在本章的最后,我们会从消息交换的角度来深入剖析可靠会话是如何实现上述三个可靠通信诉求的。

第6章 队列服务(Queued Service)

WCF是Windows平台下传统分布式技术集大成者,这里被集成的一项分布式技术就包括MSMQ,我们把采用MSMQ作为通信手段的服务称为队列服务。为了巩固读者针对MSMQ的相关知识,我们会对MSMQ以及针对System.Messaging的编程模型进行简单的介绍。同样是通过三要素组成的终结点,队列服务对终结点有着不同的要求,我们会讨论队列服务终结点的独特之处。队列服务针对事务和会话有着完全不同的特性和实现方式,队列服务下的事务和会话是本章的一个重点。本章的最后部分会讲述在客户端和服务端如何进行错误处理。

第7章 传输安全(Transfer Security)

传输安全通过身认证让服务和客户端在进行功能性消息交互之前确定对方的身份,通过对消息的签名和加密确保消息的一致性和机密性。传输安全具有两种基本模式,即Transport和Message安全模式,本章针对不同的绑定类型对这两种安全模式的支持进行了系统的介绍。

第8章 授权与审核(Authorization and Auditing)

WCF提供了针对操作的声明式授权让某个访问者只能执行被授权的操作。Windows用户组和ASP.NET Roles这两种现成的授权方式可以被直接使用,同时支持自定义的授权模式。本章着重介绍不同授权模式的编程方式和实现原理。所谓的安全审核就是针对认证和授权所做的针对EventLog的日志记录,我们将通过具体的实例来讲述如何审核编程和实现审核背后的故事。

第9章 扩展(Extension)

整本书都在提及WCF的扩展性,本章对此进行专门的介绍。根据具体需要对WCF进行自由而灵活的扩展的前提是我们对整个WCF运行框架体系有一个深刻的认识,所以本章会为你带来针对WCF客户端和服务端运行框架的全景展示,并在此基础上介绍WCF包含的几乎所有的扩展点。

第10章 WCF 4.0新特性(New Feathures in WCF 4.0)

其实整本书都是针对WCF 4.0的,关于WCF 4.0针对现有功能的一些小改动已经包含在各个章节中。本章着重介绍WCF 4.0提供的一些全新的特性,包括默认终结点、默认绑定和行为配置、标准终结点、无.svc文件服务激活、路由服务和服务发现等。

关于作者

蒋金楠(网名Artech)现就职于某知名软件公司担任高级软件顾问。连续5届微软MVP (最有价值专家),同时也是少数的双料MVP(Solutions Architecture + Connected System)之一。国内较早接触WCF的人之一,2007年2月起在个人博客(http://www.cnblogs.com/artech)上发表了超过200篇深入介绍WCF的文章,成为目前国内WCF在线资料的主要来源。

致谢

本书得以出版,最应该感谢的人是博文视点的策划编辑张春雨老师。虽然本书上册在《WCF技术剖析(卷1)》的基础上进行了非常大的修改,但是基本的框架结构还是保留下来,所以在这里需要首先感谢为《WCF技术剖析(卷1)》的出版付出努力的编辑周筠和杨绣国(Lisa)女士,以及作为审稿人的郭金链、葛子昂、黄昕、李会军、孟永刚、王翔、曲春雨、王森(中国台湾)、张逸、张玉彬等。

必须感谢我的父母,他们赐予我一颗不算愚笨的脑袋,并从小培养我独立思考的习惯。感谢我的老婆徐妍妍,虽然你不知道什么是WCF,但你却是我最忠实的读者。如果读者觉得和《WCF技术剖析(卷1)》相比本书少了一些错别字和表达错误,这主要得力于这位贴心的“私人编辑”。

本书支持

本书涉及的很多WCF底层实现的内容,大多不能通过官方的渠道获取。它们来自本人对WCF源代码的分析、通过应用程序的证明,以及这些年来使用WCF经验的总结。由于能力有限,对于本书涉及的内容,难免存在原理或表达上的偏差。如果读者在阅读本书过程中,发现任何问题可以直接向我本人反馈。如果你遇到任何WCF相关的问题,也可以和我一起交流。

作者博客http://www.cnblogs.com/artech

作者微博http://weibo.com/artech

邮箱地址:jiangjinnan@gmail.com

本书每一章节都会提供一系列实例演示,每个实例均有编号,如S101、S202等。对于专门介绍演示实例的章节,会将编号加入标题中。本书附录给出上下册共163个实例的标号及相关描述,读者可通过如下地址下载所有实例源代码:http://files.cnblogs.com/artech/WCF全面解析.rar。