本书是WCF的权威指南。WCF是Microsoft推出的在Windows操作系统下开发面向服务应用程序的统一平台,是革命性的技术平台。作为微软授予的“软件英杰”,本书作者Juval Lwy曾经参与了WCF的战略性设计,并与WCF的开发团队一同合作,因此本书具有很高的实用价值,它对WCF进行了深入的技术剖析,而非死板的文档化描述。本书关注隐藏在特殊设计决策之后的根本原理,这些原理包括SOA开发中极度匮乏的文档,以及难以理解的特性等。通过本书,开发者与架构师不仅能够了解如何进行WCF程序设计,还能够掌握相关的设计准则、最佳实践以及WCF存在的缺陷。\r\n 本书包括50多个工具和辅助类,以及70多个设计图,它们都设计用来提高我们的生产力,保障WCF服务的质量,同时能弥补WCF自身存在的一些缺陷,并帮助简化和自动化特定任务。\r\n 除了介绍面向服务的基础知识外,本书涵盖了以下内容:\r\n ?服务契约分解。 \r\n ?事务与错误处理。\r\n ?数据契约版本控制与封送。 \r\n ?并发管理。\r\n ?可伸缩性策略。 \r\n ?队列服务。\r\n ?操作、调用与事件。 \r\n ?面向服务安全性。\r\n ?本书从软件工程的角度出发,深入探索了WCF的每个主题。本书能够使您如虎添翼,从而设计出可维护的、可扩展的、可重用的SOA应用程序。
序 \r\n前言 \r\n第1章 WCF基础 \r\n 什么是WCF \r\n 服务 \r\n 地址 \r\n 契约 \r\n 托管 \r\n 绑定 \r\n 终结点 \r\n 元数据交换 \r\n 客户端编程 \r\n 编程方式配置与管理方式配置 \r\n WCF体系架构 \r\n 使用通道 \r\n 可靠性 \r\n第2章 服务契约 \r\n 操作重载 \r\n 契约的继承 \r\n 服务契约的分解与设计 \r\n 契约查询 \r\n第3章 数据契约 \r\n 序列化 \r\n 数据契约特性 \r\n 数据契约层级 \r\n 数据契约等效性 \r\n 版本控制 \r\n 枚举 \r\n 委托与数据契约 \r\n 数据集与数据表 \r\n 泛型 \r\n 集合 \r\n第4章 实例管理 \r\n 行为 \r\n 单调服务 \r\n 会话服务 \r\n 单例服务 \r\n 分步操作 \r\n 实例停用 \r\n 限流 \r\n第5章 操作 \r\n 请求-应答操作 \r\n 单向操作 \r\n 回调操作 \r\n 事件 \r\n 流操作 \r\n第6章 错误 \r\n 错误与异常 \r\n 错误契约 \r\n 错误处理扩展 \r\n第7章 事务 \r\n 恢复的挑战 \r\n 事务 \r\n 事务传播 \r\n 事务协议和管理器 \r\n 事务类 \r\n 事务型服务编程 \r\n 显式事务编程 \r\n 服务状态管理 \r\n 实例管理与事务 \r\n 回调 \r\n第8章 并发管理 \r\n 实例管理与并发 \r\n 服务并发模式 \r\n 实例与并发访问 \r\n 资源与服务 \r\n 资源同步上下文 \r\n 服务同步上下文 \r\n 定制服务同步上下文 \r\n 回调与客户端安全 \r\n 回调与同步上下文 \r\n 异步调用 \r\n第9章 队列服务 \r\n 离线服务与客户端 \r\n 队列调用 \r\n 事务 \r\n 实例管理 \r\n 并发管理 \r\n 传递故障 \r\n 回放失败 \r\n 队列调用与联机调用 \r\n 响应服务 \r\n HTTP桥 \r\n第10章 安全 \r\n 身份验证 \r\n 授权 \r\n 传输安全 \r\n 身份管理 \r\n 总体策略 \r\n 场景驱动方式 \r\n 局域网应用程序 \r\n 互联网应用程序 \r\n B2B应用程序 \r\n 匿名应用程序 \r\n 无安全 \r\n 场景总结 \r\n 声明式安全框架 \r\n 安全审核 \r\n附录A 面向服务概述 \r\n附录B 发布-订阅服务 \r\n附录C WCF编码规范
对于分布式系统,或者说业界不断提及的互联系统的设计与构建,我与本书作者Juval L歸y可谓志同道合。我们经历了相似的技术历程,虽然我们效力于不同的公司,负责不同的项目,工作在不同的地方,但我们却有着共同的目标。
20世纪90年代早期,我们开始了对一种新技术理念的探索,即实现计算机之间的通信与交互。这种被称为分布式系统应用程序的平台技术也逐渐为世人所了解。随着工作站与服务器硬件的逐渐普及,经济因素不再成为制约发展的瓶颈,构建不依赖于单事务网络中心的大型系统就成为了技术热点。对于大范围的数据交换系统而言,同样如此。在过去,我的电话公司如果要求每秒钟传递超过1200位的数据几乎是不可能的,而在如今看来连这都达不到简直不可思议。在同样的线路上,今天的传输速度已经达到了6Mbit/s。这真是一个激动人心的时代啊。
随着分布式计算技术的逐渐成熟,在90年代早期分属两大阵营的大型分布式系统技术渐露峥嵘,即数字设备公司(最终被康柏兼并,并入惠普)主导的DCE技术,以及OMG组织(主要由IBM支持)倡导的CORBA技术。然而在1996~1997期间,所有这些杰出的工程学成果却突然停滞不前。因为此时是互联网的世界,整个世界都疯迷于HTML、HTTP、风险投资以及IPO(Initial Public Offerings,首次公开募股)。整个行业花费了整整10年的时间才逐渐从泡沫经济带来的崩溃中恢复过来。不仅是经济的复苏,技术的发展也重新走回正轨。随之获益的是分布式系统技术由此打破了过去由两大阵营各占半壁江山的局面,多达数十种新的分布式技术如雨后春笋一般展现在人们眼前,使我们拥有了更多的抉择权。
直到2007年,整个行业仍然在为分布式系统的正确编码方式争论不休。Sun公司或者BEA力主Java;而我在微软的同事(包括我)则坚定地主张C#或者Visual Basic才是最佳的实现方式。无论是Sun、BEA、IBM还是微软,都希望机器之间的通信标准能够达成一致。试想昔日的DCE与CORBA之争,正是因为达成了一致的标准规范才为如今的SOAP 1.1奠定了基础,从而开创了分布式技术的盛大场面。
自从SOAP 1.1作为技术说明(Technical Note)被提交给W3C,到现在已有超过6年的历史。期间,多家行业合作商共同开发与协定了众多基于SOAP的规范,从包括寻址以及众多安全选项的基础规范,到诸如原子事务协作的企业协议。我在微软的团队,仍然非正式地称呼我们的产品为“Indigo”,它代表了整个开发与协商过程中耗费的所有心血。如果没有IBM、微软以及其他合作伙伴对创建通用标准集的大力支持,在竞争如此激烈的企业领域几乎不可能存在开放标准的框架,更不可能具有支持多个开发商以及各种平台的多种实现。
诚然,WCF的实现超出了预计需要花费的时间。标准的协定耗费了大量时间,毕竟我们不能只顾着发布自己的软件(Windows Communication Foundation, WCF),而不考虑它与我们的行业合作伙伴以及竞争者之间的互操作性。设计同样如此,对于那些具有分布式系统开发经验的客户而言,他们花费了大量时间学习以及掌握了我们之前提供的分布式系统技术,包括ASP.NET服务、Web服务增强(WSE)、.NET Remoting、消息传输/MSMQ以及企业服务/COM+,我们在发布软件的同时必须考虑这些客户。
在我刚才引用的技术清单中,包含了五种技术。如果使用非托管代码,则还有更多的技术平台。WCF的其中一个最重要的设计目标就是通过简单的方式将这些技术集合起来,以一种方式进行编程。不管是构建一个队列应用程序、事务型的N层应用程序、P2P客户端、RSS种子服务器,还是构建自己的企业服务总线,都不再需要掌握那些只能解决部分问题的多种技术。我们只需要学习和使用WCF即可。这就是以一种方式编程的魅力所在。
本书展示了大量微软已经构建好的技术细节,它们可以作为您的应用程序与服务的基础。在本书中,作者以享有盛誉的写作技巧,深入浅出而又准确细致地介绍了WCF的体系架构。作为微软互联框架团队成员的我们,也为自己构建的这一产品深感自豪。我们为开发者提供了一个统一的分布式技术体系架构,它具有广泛的互操作性,全面提升了面向服务的特性。同时它还是易于学习的,有利于提高构建面向服务应用程序的生产力。作为当今最杰出的分布式系统专家之一,Juval愿意倾尽心血全力介绍WCF,我们不禁深感荣幸。我们有足够的信心相信,Juval的著作能够帮助您理解人们为什么会对这一产品的问世以及它将创造的新的机遇而激动不已。这些人也包括我们、Juval以及早期的用户社区。享受本书,开始构建您的第一个WCF服务吧。
—— Clemens Vasters
程序经理,微软互联框架团队
(Connec
2001年8月,我在微软首次了解到使用托管代码重写COM+的技术细节。随后一切如常,直到2002年7月,在对C#2.0作战略性设计评审期间,负责Remoting的程序经理提出了一个宏伟的计划,试图将Remoting重写为开发者真正能够使用的技术。同时,微软也在寻求合作,共同为ASMX中的Web服务制定全新的安全规范,起草一系列附加的Web 服务规格说明书。
到了2003年7月,我有机会体验了一个全新的事务型体系架构,它能够改善.NET编程中关于事务处理的相关缺陷。当时,并没有一个稳定的编程模型能够统一那些独立的技术。直到2003年末,我有幸获邀参加一个由同行专家组成的小型团队,对代号为Indigo的开发平台进行战略性的设计评审。就我所知,这个开发团队可谓人才济济,汇聚了许多世界上最优秀的天才。在接下来的2~3年时间内,Indigo一共经历了三代编程模型版本的演变。就在2005年早期发布了基于终结点驱动对象模型的版本之后,终于在当年8月逐渐稳定为一个固定的版本,同时更名为Windows Communication Foundation(WCF)。要想得到开发者的众口称赞,可谓难于上青天,然而WCF却给了我们不同的诠释。对于Web服务的开发者而言,WCF就是最终的应对互操作性的解决方案,实现了大多数行业标准。分布式应用程序的开发者则认为它简化了远程调用以及队列调用。系统开发者认为它具备下一代面向产品的特征,诸如事务与宿主,为应用程序提供了现成的基础功能模块。至于应用程序的开发者,WCF则为他们构建应用程序提供了声明式的编程模型。而对于架构师,WCF则是构建面向服务应用程序的最终选择。一言以敝之,WCF涵盖了以上所有的一切,因为设计WCF的目的就是为了能够统一微软的下一代全新的技术。
对我而言,WCF就是下一代开发者平台,它在很大程度上包容了最初的.NET编程理念。任何.NET开发者都可以使用WCF,而不用考虑应用程序的类型、规模或者行业领域。WCF是一门基础技术,它提供了生成服务与应用程序的“终南捷径”,完全符合我所认同的良好的设计准则。WCF从一开始就是工程化的,能够简化应用程序的开发与部署,降低开发成本。WCF服务用于构建面向服务的应用程序,不管这些程序是独立的桌面应用程序,还是Web应用程序和服务,还是高端的企业应用程序。
本书的结构
本书涵盖了所有设计开发基于WCF的面向服务应用程序所需的知识与技能。通过本书,你可以看到如何利用WCF内建的特性,例如服务托管、实例管理、并发管理、事务、离线队列调用以及安全。本书会为你展示如何使用这些特性并探究它们在这种特定的设计思路下的实现原理。你不仅能够了解到WCF编程技术,以及相关的系统知识,同时还包括了相应的设计方案、诀窍、最佳实践以及存在的缺陷。我之所以站在软件工程的立场阐述本书的每个主题与特征,是因为我期望它能够帮助读者不仅要成为一名WCF专家,而且还要成为一名优秀的软件工程师。本书带给您的这种认知能够使你如虎添翼,让你的应用程序在可维护性、可扩展性、可重用性以及高效性方面,更加符合软件工程的理念。
本书回避了许多WCF的实现细节,更多的是注重使用WCF的实用性与可行性:如何应用WCF技术?如何选择可行的设计原则与编程模型?本书大量使用了.NET 2.0技术,从某种角度来说,本书也可以算是一本高级的C#技术书籍。除此之外,本书包含了大量我所编写的套件类、工具类以及辅助类。这些内容可以提高你的开发效率,保障开发的WCF服务的质量。我还开发了一个基于WCF技术的小型框架,用以弥补一些设计缺陷,或者简化确切的任务,使其能够自动化实现。在书中,我像介绍WCF技术那样,详细地介绍了这些工具、理念与技术。同时,我开发的框架则为你演示了如何对WCF进行扩展。
在过去的两年中,我在MSDN杂志上发表了大量关于WCF的文章。目前,我还在为杂志的基础专栏(Foundations Column)撰写WCF技术文章。我要感谢杂志社能够允许我将这些文章收录到本书中。如果你曾经阅读过这些文章,或许能够从本书的相关章节中发现它们的影子。比较而言,本书的章节更加全面,提供了WCF的多种视角、技术与实例,而且这些主题也与书中的其他章节紧密相连。
我在每一章中都系统地讲解了一个专题,深入探讨了这些专题的内容。然而,每一章又都依赖于前一章的内容,因此,我建议你最好按照先后顺序阅读本书。
以下是书中各章节以及附录的摘要。
第1章,WCF基础
该章首先阐释了WCF的技术原理,并描述了WCF的基础概念和构建模块,例如地址、契约、绑定、终结点、托管以及客户端。在该章最后还讨论了WCF体系架构,它将是帮助我们理解后面章节的关键。该章假定读者已经了解面向服务的思想与优势。如果你不具备这方面的知识,可以首先阅读附录A的内容。即使你已经熟悉了WCF的基础概念,我仍然建议你至少能够快速地浏览该章的内容,它不仅能够巩固你已有的知识,更在于该章介绍的一些辅助类与技术术语有助于阅读全书。
第2章,服务契约
该章致力于介绍服务契约的设计与开发。首先,你会了解到一些有用的技术,包括服务契约的重载与继承以及其他高级技术。然后,该章深入探讨了如何设计以及分解契约,以利于服务的重用、可维护性以及可扩展性。最后,展示如何通过公开契约元数据完成运行时的交互编程。
第3章,数据契约
如果没有实际存在的可共享的数据类型本身,如果没有使用相同的开发技术,应该如何处理客户端与服务之间的数据交换?在该章,你可以看到如何处理某些有趣的现实问题,例如数据版本控制,以及传递元素项集合的方式。
第4章,实例管理
究竟是哪一种服务实例处理哪一种客户端的请求?该章给出了问题之钥。WCF支持多种服务实例管理、激活以及生命周期管理技术,这些技术与系统规模和性能息息相关。该章给出了每一种实例管理模式之间的关系,指导读者何时以及如何有效地使用它们。该章还介绍与之相关的主题,例如限流。
第5章,操作
随着对各种类型操作的处理,客户端能够调用服务,遵循相关的设计原则,例如如何改善和扩展基础功能,以支持回调的安装与销毁,管理回调端口与通道,提供类型安全的双向代理。
第6章,错误
该章全面介绍了服务将错误与异常返回给客户端的方式,毕竟,诸如异常与异常处理的构建都是一门特定的技术,无法穿越服务边界。该章介绍了错误处理的最佳实践,使开发者能够解除客户端错误处理与服务的耦合度。该章还演示了如何扩展以及改善WCF基础的错误处理机制。
第7章,事务
首先,该章从整体上介绍了使用事务的目的,然后讨论了事务服务的众多特征:事务管理架构、事务传播配置、WCF提供的声明性事务支持,以及客户端创建事务的方式。最后,该章讨论了与事务相关的设计原则,例如事务服务状态管理与实例模式。
第8章,并发管理
WCF提供了一种强大而简单的声明方式,用来管理客户端与服务的并发与同步。该章展现了诸多高级技术,例如回调、重入、线程关联度、同步上下文以及避免死锁的最佳实践与原则。
第9章,队列服务
该章描述了客户端如何通过队列调用服务,从而支持异步与离线工作。该章首先介绍如何创建与配置队列服务,然后,重点讲解诸如事务、实例管理、故障以及它们对服务业务模型与实现造成的影响。
第10章,安全
通过将多个方面的任务分解为一些基本的要素,如消息传递、认证和授权,就可以揭开面向服务安全神秘的面纱。该章演示了如何为局域网和互联网应用程序等关键场景提供安全保障。最后,你可以看到我为声明式的WCF安全所编写的框架,设计为自动实现安全的设置,从而极大地简化对安全的管理。
附录A,面向服务概述
附录A为那些希望了解面向服务的读者提供,介绍了我在面向服务的具体应用。附录定义了面向服务应用程序(而非通常所谓的架构)以及服务自身,检验了它在方法学方面的优势。附录还给出了面向服务的原则,通过大多数应用程序所需要的实用要点,强化了面向服务的抽象原则。
附录B,服务发布与订阅
附录B展现了我定义的框架,它实现了发布-订阅事件管理的解决方案。框架可以使你只需要编写一两行代码就能发布和订阅服务。发布-订阅模式属于第5章的内容,之所以将它放入到附录中,是因为它使用了其他章节的内容,例如事务与队列调用。
附录C,WCF编码规范
基本上,附录C涵盖了全书提及的甚至于没有提及的最佳实践。规范在于阐释应该“如何做”以及“怎么做”,而不阐明其原因。隐藏在规范之中的基础原理可以在本书的其余部分找到。该规范同时还使用了本书讨论的辅助类。
对于读者的要求
本书假定读者是一名经验丰富的开发者,熟悉诸如封装与继承等面向对象的概念。我会利用读者现有的对对象和组件技术以及术语的认知,巩固对WCF知识的了解。读者应该对于.NET以及C# 2.0的基础知识(包括泛型与匿名方法)有着清晰的了解。虽然本书大部分内容使用的是C#语言,然而对于Visual Basic 2005的开发者而言,仍然具有参考价值。
怎样使用本书
若要使用本书,需要安装.NET 2.0、Visual Studio 2005、.NET 3.0的发布组件,以及.NET 3.0开发的SDK和Visual Studio 2005的.NET 3.0扩展版。除非特别提示,本书适用的操作系统包括Windows XP、Windows Server 2003和Windows Vista。同时,你还需要安装一些附加的Windows组件,如MSMQ和IIS。
无封面