WCF技术剖析(卷1)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

第一次邂逅WCF是在微软举办的一场关于Windows Vista技术推广的培训上,时间大概是2005年10月份,当时我对WCF可谓一见钟情。如果读者也像我一样,之前习惯了采用.NET Remoting、XML Web Service、WSE、MSMQ来架构分布式应用的话,应该不难想象我第一次接触WCF时心中的那份震撼。WCF是Windows平台下所有分布式技术集大成者,它将这一系列独立的分布式技术整合,提供一个统一的应用编程接口,这本身就是一项创举。这些被整合的分布式技术不仅仅包含前面提到的这些,还包括DCOM、Enterprise Service等。WCF并非单纯地将它们进行简单的累加,而是从底而上进行了革新性的重新设计,使WCF成为了一个可定制、可扩展的通信框架。

WCF,全称Windows Communication Foundation,从命名上我们就不难看出微软对WCF所寄予的厚望,他们要将WCF打造成为Windows平台下唯一的通信基础框架。从WCF这些年的发展使用,以及未来趋势的预测来看,WCF没有辱没这样的使命。这几年持续灼热的SOA尚未有降温的迹象,云计算又开始沸腾了。不论是SOA,还是云计算,都须要解决一个核心的问题,那就是通信(Communication),而WCF解决的就是通信问题。相信大家不难想象WCF在整个Windows产品体系中将会具有怎样的一个“江湖地位”。

基于对WCF的浓厚兴趣,我这些年来一直没有放弃对WCF的研究,加上在众多项目中的实践,我逐渐对WCF有了一些积累。在写这本书之前,我阅读了现今已经出版的绝大部分WCF著作,并订阅了很多WCF专家的博客,一遍又一遍地翻看MSDN,我想可能很少有人会像我一样一次又一次地从头到尾阅读WCF MSDN。在获取知识的过程中,我发现了这样的一个现象:通过上述这些途径获取的资料绝大部分都仅限于WCF编程层面的介绍。若试图了解整个WCF一些底层的实现机制,是很难找到相关参考资料的。在这些年的学习和项目实践中,不论是对于WCF的编程模型、底层实现,还是设计思想,我感觉都有了一定的积累和沉淀。所以希望尽我所能,写一部全面剖析WCF的书籍,与读者分享。

在工作中,有读者可能会这样想:我仅仅是一个普通的WCF编程人员或项目实施人员,只须要知道WCF程序如何编写和配置就可以了,何须花那么多时间和精力去了解所谓的实现原理和设计模式呢。我个人认为这样的想法是片面的,正如一个对.NET Framework不了解的人不可能写出高质量的.NET程序一样,一个对WCF实现机制完全不了解的人也难以写出高质量的WCF服务。至于设计,如果不理解面向服务(SO:Service Orientation)的设计思想,还是按照传统的面向组件(CO:Component Orientation)来设计WCF服务,那将是对WCF最大的误用。

WCF不但提供了强大的通信功能,而且还是一个极具可扩展性的通信框架。WCF的通信实现是一个相对复杂的流程,它在整个通信处理流程中为每一个步骤提供了扩展点。用户可以通过实现相关的接口,或者继承相应的基类,自定义这些扩展的组件。最终通过配置或其他方式(比如应用自定义特性)将这些定制的组件应用到WCF的整个处理流程中,从而改变WCF的通信行为,让WCF按照你希望的方式工作。当然,自由灵活地对WCF进行扩展要建立在你对WCF的底层实现充分了解的基础之上。

由于WCF涉及的内容实在太多,《WCF技术剖析》不得不拆分为多卷来写。卷1首先出版,随后会进行卷2的写作。

本书的特点

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

注重原理

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

注重细节

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

注重实践

“实践出真知”,不断地在具体应用中进行实践是学习WCF最有效的手段。实践是检验真理的唯一标准,通过将所学的WCF的知识应用到一个真正的应用之中,才能确保我们掌握的知识的正确性。此外,实践不但可以巩固我们的所学,还会让我们意识到不足。《WCF技术剖析》在每一章节都会提供一系列的案例演示,通过一个个具体案例应用去实践WCF。

本书为谁而作

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

本书的结构

本书以分卷的形式出版,第1卷率先完稿,后续部分也已列入作者的写作计划。《WCF技术剖析(卷1)》涵盖WCF最基本的框架,相关的内容已经赋予了读者构建一个基本WCF应用的能力。本卷共分10章,各章的内容如下。

第1章 WCF简介(WCF Overview)

本章简单讲述了WCF产生的历史背景,以及WCF在微软产品线中所处的地位。本章的最后将提供一个功能简单,但结构完整的WCF事例应用程序。该事例应用程序涵盖了构建一个基本WCF应用所需的所有步骤,其中包括服务契约(Service Contract)的定义、服务的实现、服务的寄宿(Service Hosting)、元数据(Metadata)的发布和导入、服务代理的创建和服务调用等。在一步一步对案例应用进行演示的过程中,还穿插介绍了WCF的一些基本概念和原理,比如终结点(Endpoint)、地址(Address)、绑定(Binding)、契约(Contract)、元数据(Metadata)、服务寄宿(Service Hosting)等。

第2章 终结点地址与WCF寻址(Endpoint Address and WCF Addressing)

本章着重介绍终结点三要素之一的“地址(Address)”和相关的寻址(Addressing)机制。在本章中,我们会谈到不同网络协议地址之间的差异,以及如何在服务寄宿和服务调用的时候通过代码或配置的方式设定终结点的地址。本章涉及的内容还包括通过地址报头(Address Header)的形式为消息添加寻址信息,以及端口共享在WCF中的应用。本章的最后将深入介绍WCF下寻址的实现机制。

第3章 绑定和信道栈(Binding and Channel Stack)

本章着重介绍终结点的第二个元素:“绑定(Binding)”,并以绑定作为切入点,对WCF整个信道层进行深入而详细的讲解。本章会介绍WCF信道层所涉及的所有相关组件,包括信道(Channel)、信道管理器(Channel Manager)、信道监听器(Channel Listener)、信道工厂(Channel Factory)、绑定元素(Binding Element),以及绑定上下文(Binding Context)等。在本章的最后还会对常见的系统绑定进行全面的剖析和比较,并且指导读者创建自定义的绑定。

第4章 服务契约(Service Contract)

终结点的服务契约元素的介绍放在本书的第4章。为了让读者深入理解契约的本质,在本章的一开始,我们将从“抽象与接口”、“服务描述”及“消息交换模式”全方位、多角度透视WCF中的服务契约。紧接着,将详细介绍如何通过ServiceContractAttribute和OperationContractAttribute这两个自定义特性来定义服务契约。在本章的最后,将会深入探讨操作契约和消息交换模式之间的关系,以及如何定义适合多线程场景中的服务契约。

第5章 序列化与数据契约(Serialization and Data Contract)

本章着重介绍WCF对“数据”的处理,包括数据的定义(数据契约)和数据的序列化及反序列化。本章将从序列化在一个分布式应用中所起的重要作用谈起,然后详细介绍数据契约的定义,以及数据契约序列化器(DataContract Serializer)进行序列化和反序列化的实现原理和规律。本章涉及的内容还包括:如何为数据契约序列化器设定已知类型(KnownType),以及已知类型在序列化和反序列化过程中所起的重要作用;如何定义基于范型数据契约和集合数据契约;等价数据契约在WCF消息交换中的意义。在本章的最后,我们将介绍在整个WCF消息分发、处理流程中,是如何实现数据的序列化和反序列化的。

第6章 消息、消息契约与消息编码(Message,Message Contract and Message Encoding)

本章的所有内容都是围绕着消息(Message)展开的,首先我们会通过SOAP1.2规范介绍一个SOAP消息的基本结构,并由此引出消息在WCF的表示:System.ServiceModel. Channels.Message类型的介绍。在介绍Message类型的时候,将重点介绍消息处理中消息对象表现出来的状态机(State Machine)。接下来会介绍消息契约(Message Contract)的定义,以及消息契约的应用场景的选择。消息编码(Message Encoding)是本章的重点,我们会对WCF采用的3种典型的编码方式进行全面的分析和比较,在本节的最后部分还会深入介绍消息编码分别在WCF服务端与客户端框架中的实现原理。

第7章 服务寄宿(Service Hosting)

服务的寄宿是部署服务必需的步骤,为了让读者了解服务寄宿(Service Hosting)的本质,我们会从服务描述(Service Description)谈起。接下来再深入探讨在服务寄宿的每一个步骤中,WCF内容为我们作了哪些“鲜为人知”的操作。本章的后半部分,我们会讨论4种常见的服务寄宿方式,包括自我寄宿(Self-Hosting)、IIS寄宿(IIS Hosting)、WAS寄宿(WAS Hosting)和Windows Service寄宿(Windows Service Hosting)。在介绍基于IIS服务寄宿的过程中,我们会对不同版本的IIS(IIS5.x, IIS 6.0, IIS 7.0)的工作机制进行全面的分析和比较,并就IIS和ASP.NET管道之间的通信进行详细介绍。此外,还会深入介绍两种不同模式下,即ASP.NET并行(ASP.NET Side by Side)模式和ASP.NET兼容(ASP.NET Compatible)模式,实现WCF服务寄宿的实现原理和表现行为。

第8章 客户端(Client)

本章主要介绍在客户端如何创建服务代理进行服务调用,以及WCF客户端框架内部如何完成一次正常的服务调用。WCF具有两种典型的服务调用方式:通过添加服务引用或通过相应的工具导入元数据并声称客户端代理类型(继承字ClientBase<T>)和相关配置;借助ChannelFactory<T>直接创建服务代理对象。通过本章的介绍,你将对这两种服务调用方式具有一个全面的认识,本章还将深入剖析ClientBase<T>和ChannelFactory<T>这两个重要的类型。在本章的最后部分会为你提供基于会话服务调用的最佳实践。

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

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

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

《WCF深入剖析(卷1)》将为你提供一个WCF版本的PetShop,通过一个具体实在的例子,指导读者如何利用WCF构建一个完整的分布式应用。在该案例应用中,不仅仅会为你提供单纯WCF相关的应用,还引入了一系列设计模式,包括:模块化与层次化设计、面向方面编程(AOP,Aspect Oriented Programming)、控制倒置(IoC,Inverse of Control)与依赖注入(DI,Dependency Injection)、MVP(Mode-View-Presenter)模式等。我们还会根据PetShop,介绍如何通过WCF扩展实现与微软开源开发框架企业库集成,比如通过与Unity的继承将DI容器引入WCF应用服务实例的创建;通过与EHAB(Exception Handling Application Block)继承实现可配置的异常处理;通过Unity与PIAB(Policy Injection Application Block)将实现基于AOP的编程等。

关于《WCF技术剖析(卷2)》

《WCF技术剖析(卷2)》将按照与卷1相似的方式对WCF一些相对“高级”的主题进行介绍,大概的内容包括:异常处理(Exception Handling)、元数据(Metadata)、并发与流量限制(Concurrency and Throttling)、事务(Transaction)、安全(Security)、WCF分发体系(WCF Dispatching System)、WCF扩展(WCF Extension)等。

关于作者

蒋金楠,网名Artech,现就职于某知名软件公司担任高级软件顾问(Senior Software Consultant)。微软解决方案架构(Solutions Architecture)与互联系统(Connected System)双料MVP(最有价值专家),具有5年以上软件开发设计与架构经验。对.NET Framework、C#、ASP.NET、SQL Server、设计模式、软件架构及主流的开源框架具有深入的研究。属国内较早接触WCF的人之一,同时对.NET Remoting、MSMQ通信技术有深入的理解。2007年2月起在个人博客(http://www.cnblogs.com/artech)上发表数十篇深入介绍WCF的文章,成为国内WCF技术最早的推广者之一。

致谢

本书得以出版,最应该感谢的人是博文视点的资深编辑周筠女士和杨绣国(Lisa)女士,她们的专业能力和认真的工作态度给我留下深刻的印象,感谢Lisa在我因工作原因不能按时交稿时给予的理解。两个月后,Lisa即将初为人母,在这里表示衷心的祝福。同时,要感谢博客园的创始人杜勇为我们创建了一个这么好的技术学习和交流的平台,而且本书的出版也依赖于杜勇本人的推荐。此外,还要感谢郭金链、葛子昂、黄昕、李会军、孟永刚、王翔、曲春雨、王森(台湾)、张逸、张玉彬等人在百忙之中为本书审稿,并提出宝贵的建议,本人收益良多。同时曲春雨、李会军和王翔三位老师还为本书写了推荐序,感谢之情无以言表。最后要感谢我博客文章的所有读者,是你们让我具有了创作的勇气。

当然,必须感谢我的父母,他们赐予我一颗不算愚笨的脑袋,并从小培养我独立思考的习惯。感谢我未来的老婆徐妍妍,当我才思枯竭的时候同她谈心总能让我灵感四溢。在本书创作期间,发生了一些事情给她们全家带来了难以愈合的伤口,希望时间能够尽快治愈她们心灵的创伤,祝她的家人永远健康幸福。

本书的支持

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

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

邮箱地址:jiangjinnan@gmail.com