第一次邂逅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有了一些积累。本着知识分享的目的,2007年2月,在国内最具影响力的.NET社区博客园开了自己的博客(http://www.cnblogs.com/artech),写了数十篇关于WCF的文章,并得到广大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涉及的内容实在过多,《WCF技术剖析》不得不拆分为多卷。卷一首先出版,随后会进行卷二的写作。
【本书的特点】
如果实在要说出《WCF技术剖析》具有哪些市面上其他WCF专著不具备的特点的话,我觉得可以通过以下三个“注重”来概括:
注重原理
“知其然,知其所以然”,对一项技术实现原理的把握能够帮你更加有效的利用这项技术。WCF建立在.NET平台下,提供基于托管代码的应用编程接口(API),在编程层面不会太复杂,也很容易入手。但是,如果希望通过WCF构建一个高性能、可维护性、可扩展性的分布式应用,就要求架构师、设计师和开发者对WCF的实现机制,以及面向服务的设计原理具有正确、全面而深入的理解。当然,对于基于WCF编程的介绍,对于任何一本WCF的专著是必需的,《WCF技术剖析》也不例外,只是和哪些完全介绍WCF编程的书不同的是,相关内容仅仅只占所有内容的一半左右。
注重细节
“细节决定成败”,如果将2/8原则应用到编程领域,则体现在:花20%的时间编写80%程序主体,而80%时间用于剩下20%核心程序的纠错和解决BUG。这些Bug的产生往往由于对细节的不够重视所导致。《WCF技术剖析》会介绍一些不被人轻易意识到的一些细节,这些细节来自于作者多年来实践的总结。
注重实践
“实践出真知”,不断地在具体应用中进行实践是学习WCF最有效的手段。实践是检验真理的唯一标准,通过将所学的WCF的知识应用到一个真正的应用之中,才能确保我们掌握知识的正确性。此外,实践不但可以巩固我们的所学,还会让我们意识到所学的不足。《WCF技术剖析》在每一个章节都会提供一系列的案例演示,通过一个个具体案例应用去实践WCF。
【本书为谁而作】
本书的内容不仅仅适合于那些尚未接触过WCF,希望尽快入门并进行深入研究的开发人员,同样适合那些对WCF具有一定了解的开发设计人员和架构师。相信不同的层次的读者都能从本书中找到自己希望了解的部分。阅读本书的读者需要对.NET,包括对C#和.NET Framework具有一定的了解。如果读者具备了DCOM、Enterprise Library Service、.NET Remoting、Web Service、MSMQ以及SOA相关的基础,对于尽快掌握WCF将大有裨益。
【本书的结构】
本书采用分卷的形式出版,第一卷率先完稿,后续部分也已列入作者的写作计划。《WCF技术剖析(卷一)》涵盖WCF最基本的框架,相关的内容已经赋予了读者构建一个基本WCF应用的能力。本卷一共分为10个章节,各个章节的内容如下:
第一章WCF简介(WCF Overview)
本章简单讲述了WCF的历史背景,以及WCF在微软产品线中所处的地位。本章的最后将提供一个功能简单,但结构完整地WCF事例应用程序。该事例应用程序涵盖了构建一个基本WCF应用所需的所有步骤,其中包括服务契约(Service Contract)的定义、服务的实现、服务的寄宿(Service Hosting)、元数据(Metadata)的发布和导入、服务代理的创建和服务调用等等。通过一步一步对案例应用进行演示过程中,还穿插介绍了WCF的一些基本概念和原理,比如终结点(Endpoint)、地址(Address)、绑定(Binding)、契约(Contract)、元数据(Metadata)、服务寄宿(Service Hosting)等。
第二章 终结点地址与WCF寻址(Endpoint Address and Addressing)
本章着重介绍终结点的三要素之一的“地址(Address)”和相关的寻址(Addressing)机制。在本章中,我们会谈到基于不同网络协议地址之间的差异,以及如何在服务寄宿和服务调用的时候通过代码或者配置的方式设定终结点的地址。本章涉及到的内容还包括通过地址报头(Address Header)的形式为消息添加寻址信息,以及端口共享在WCF中的应用。本章的最后我们将深入介绍WCF下寻址的实现机制。
第三章 绑定和信道栈(Banding and Channel Stack)
本章着重介绍终结点的第二个元素:“绑定(Binding)”,并以绑定作为切入点,对WCF整个信道层进行深入而详细的讲解。本章会介绍WCF信道层所涉及的所有相关的组件,包括信道(Channel)、信道管理器(Channel Manager)、信道监听器(Channel Listener)、信道工厂(Channel Factory)、绑定元素(Binding Element)以及绑定上下文(Binding Context)等。在本章的最后还会对常见的系统绑定进行全面的剖析和比较,并且知道读者创建自定的绑定。
第四章 服务契约(Service Contract)
终结点的服务契约元素的介绍放在本书的第四章。为了让读者深入理解契约的本质,在本章的一开始,我们将从“抽象与接口”、“服务描述”以及“消息交换模式”全方面、多角度透视WCF中的服务契约。紧接着,我们将详细介绍如何通过ServiceContractAttribute和OperationContractAttribute这两个字定义特性来定义服务契约。在本章的最后,将会深入探讨操作契约和消息交换模式之间的关系,以及如何定义适合多线程场景中的服务契约。
第五章 序列化与数据契约(Serialization and Data Contract)
本章着重介绍WCF对“数据”的处理,包括数据的定义(数据契约)和数据的序列化和反序列化。本章将从序列化在一个分布式应用中所起的重要作用谈起,然后详细介绍数据契约的定义以及数据契约序列化器(DataContract Serializer)进行序列化和反序列化的实现原理和规律。本章涉及的内容还包括:如何为数据契约序列化器设定已知类型(KnownType),以及已知类型在序列化和反序列化过程中所起的重要作用;如何定义基于范型数据契约和集合数据契约;等价数据契约在WCF消息交换中的意义。在本章的最后,我们将介绍在整个WCF消息分发、处理流程中,是如何实现数据的序列化和反序列化的。
第六章 消息、消息契约与消息编码(Message,Message Contract and Message Encoding)
本章的所有内容都是围绕着消息(Message)展开,首先我们会通过SOAP1.2规范介绍一个的SOAP消息的基本结构,并由此引出消息在WCF的表示:System.ServiceModel.Channels.Message类型的介绍。在介绍Message类型的时候,对消息处理中消息对象表现出来的状态机(State Machine)的介绍其中的一个重点。接下来会介绍消息契约(Message Contract)的定义,以及消息契约的应用场景的选择。消息编码(Message Encoding)是本章的重点,我们会对WCF采用的三种典型的编码方式进行全面的分析和比较,在本节的最后部分还是深入介绍消息编码分别在WCF服务端与客户端框架中的实现原理。
第七章 服务寄宿(Service Hosting)
服务的寄宿是部署服务必需的步骤,为了让读者了解服务寄宿(Service Hosting)的本质,我们会从服务描述(Service Description)谈起。接下来,我们会深入探讨在服务寄宿的每一个步骤中,WCF内容为我们作了哪些“鲜为人知”的操作。本章的后半部分,我们会讨论四种常见的服务寄宿方式,包括自我寄宿(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服务寄宿的实现原理和表现行为。
第八章 客户端(Client)
本章主要介绍在客户端如何创建服务代理进行服务调用,以及WCF客户端框架内部如何完成一次正常的服务调用。WCF具有两种典型的服务调用方式:通过添加服务引用或者通过相应的工具导入元数据并声称客户端代理类型(继承字ClientBase<T>)和相关配置;借助ChannelFactory<T>直接创建服务代理对象。通过本章的介绍,你将对这两种服务调用方式具有一个全面的认识,本章还将深入剖析ClientBase<T>和ChannelFactory<T>这两个重要的类型。在本章的最后的部分还会为你提供基于会话服务调用的最佳实践。
第九章 事例与会话(Instancing and Session)
实例化(Instancing)和会话(Session)是WCF中两个重要的概念,前者旨在实现服务实例对象的激活,后者则实现对客户端调用状态的保持。本章将详细介绍WCF三种典型的事例化模式所表现的行为、实现的原理以及各自适合的场景。在介绍会话的部分会对深入剖析会话如何保持客户端多次服务调用的状态,以及会话、实例化模式、绑定和信道之间的关系。
第十章 WCF实例研究
《WCF深入剖析(卷一)》将为你提供一个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的编程等。
【致谢】
本书得以出版,最应该感谢的人是博文视点的资深编辑杨秀国女士,她的专业能力和认真的工作态度给我留下深刻的印象,感谢她对我犹豫工作的原因不能按时交稿的理解。两个月后,Lisa即将荣升为母,在这里表示衷心的祝福。同时,需要感谢博客园创始人杜勇为我们创建了一个这么好的技术学习和交流的平台,同时本书的出版也依赖于杜勇本人的推荐。此外,需要感谢郭金链、葛子仰、黄昕、李会军、孟永刚、王翔、曲春雨、王森(台湾)、张逸、张玉彬在百忙之中为本书审稿,并提出的宝贵的建议,本人收益良多。同时王翔和曲春雨两位老师还为本书写了推荐序,感谢之情无以言表。最后需要感谢我博客文章的所有读者,使你们让我具有了创建的勇气。
当然,必须感谢我们父母,赐予我一颗不算愚笨的脑袋,并从小培养我独立思考的习惯。感谢我未来的老婆徐妍妍,当我才思枯竭的时候同她谈心总能让我灵感四溢。在本书创作期间,发生了一些事情给她们全家带来了难以密闭的伤疼,希望时间能够尽快治愈她们心灵的创伤,祝全家人永远健康幸福。
【本书的支持】
由于本书涉及到WCF很多底层实现的内容,这些内容是不可能通过官方的渠道获取。它们大多来自本人对WCF源代码的分析、通过应用程序的证明以及多年来使用WCF经验的总结。由于能力有限,对于本书涉及的内容,难免出现一些原理或者表达上的偏差。如果读者在阅读本书过程中,发现任何问题可以直接向我本人反馈。当然如何你遇到任何WCF相关任何问题,都可以和我一起交流。
作者博客:http://www.cnblogs.com/artech
邮箱地址:[email protected]