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的基础概念和构建模块,例如地址(Addresses)、契约(Contracts)、绑定(Bindings)、终结点(Endpoints)、托管(Hosting)以及客户端(Clients)。在本章最后还讨论了WCF体系架构,它将是帮助我们理解后面章节的关键。本章假定读者已经了解面向服务的思想与优势。如果你不具备这方面的知识,可以首先阅读附录A的内容。即使你已经熟悉了WCF的基础概念,我仍然建议你至少能够快速地浏览本章的内容,它不仅能够巩固你已有的知识,更在于本章介绍的一些辅助类与技术术语有助于你阅读全书。
第2章,服务契约
本章致力于介绍服务契约的设计与开发。首先,你会了解到一些有用的技术,包括服务契约的重载与继承以及其它高级技术。然后,本章深入探讨了如何设计以及分解契约,以利于服务的重用、可维护性以及可扩展性。最后,本章还将向你展示了如何通过公开契约元数据完成运行时的交互编程。
第3章,数据契约
如果没有实际存在的可共享的数据类型本身,如果没有使用相同的开发技术,我们应该如何处理客户端与服务之间的数据交换?在本章,你可以看到如何处理某些有趣的现实问题,例如数据版本控制,以及传递元素项集合的方式。
第4章,实例管理
究竟是哪一种服务实例处理哪一种客户端的请求?本章给出了问题之钥。WCF支持多种服务实例管理、激活以及生命周期管理技术,这些技术与系统规模和性能息息相关。本章给出了每一种实例管理模式之间的关系,指导读者何时以及如何有效地使用它们。本章还介绍与之相关的主题,例如限流(Throttling)。
第5章,操作
随着对各种类型操作的处理,客户端能够调用服务,遵循相关的设计原则,例如如何改善和扩展基础功能,以支持回调的安装与销毁,管理回调端口与通道,提供类型安全的双向代理(Duplex Proxies)。
第6章,错误
本章全面介绍了服务将错误与异常返回给客户端的方式,毕竟,诸如异常与异常处理的构建都是一门特定的技术,无法穿越服务边界。本章介绍了错误处理的最佳实践,使开发者能够解除客户端错误处理与服务的耦合度。本章还演示了如何扩展以及改善WCF基础的错误处理机制。
第7章,事务
首先,本章从整体上介绍了使用事务的目的,然后讨论了事务服务的众多特征:事务管理架构、事务传播(Transaction Propagation)配置、WCF提供的声明性事务支持,以及客户端创建事务的方式。最后,本章讨论了与事务相关的设计原则,例如事务服务状态管理与实例模式。
第8章,并发管理
WCF提供了一种强大然而简单的声明方式,用来管理客户端与服务的并发与同步。本章展现了诸多高级技术,例如回调、重入(Reentrancy)、线程关联度(Thread Affinity)、同步上下文(Synchronization Context)以及避免死锁的最佳实践与原则。
第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。
本书约定
下列为本书的印刷体约定:
斜体
用于技术术语、在线链接和文件名
等宽字
用于示范代码、语句、命名空间、类、程序集、接口声明、操作符、特性以及保留字
等宽粗体字
用于代码中的重点部分
提示:该图标标示着附近的文本非常重要。
警告:该图标代表附近的文本属于警告信息。
每当我想要在实例代码中特别注明某一内容,我会在调用Debug类的Assert静态方法:
int number = 1+2;
Debug.Assert(number == 3);
Assert方法可以接收Boolean型语句,当值为false时,抛出异常。
本书推荐的命名规范与编码样式可以参见拙著《.NET组件编程(O'Reilly)》附录E中的内容。如果书中代码背离了这一标准,是因为受到了空格或代码行长度的限制。至于命名约定,我使用“Pascal casing”为公有成员方法与属性命名,即名称的每个单词首字母要大写。至于本地变量和方法参数,则使用“camel casing”方式,即名称中的第一个单词首字母不要大写。对于私有成员,我会在变量名前面加上前缀m_:
public class SomeClass
{
int m_Number;
public int Number
{get;set};
}
我采用在花括弧之间加点的形式,表示其中省略了必要但不需要指定的代码:
public class SomeClass
{...}
为清晰起见,实例代码通常并不包含using语句指定示例必须的命名空间,只有在前文中介绍到的新的命名空间,才会包含在实例代码中。
使用实例代码
“磨刀不误砍柴工”,这部分内容可以更好地帮助你完成工作。总的来说,你无须获得授权就可以在你的程序和文档中使用本书的代码,除非你对代码最重要的部分进行了二次加工。例如,使用本书的代码片段编写程序,并不需要特别的许可,但销售或分发包含本书实例代码的光盘则必须获得许可。引用本书的实例代码或问题解答是不需要授权的,然而如果要将本书实例中的核心代码放入到你的产品文档中,则需要获得许可。
我们重视图书的版权要求,然而并非必须。图书版权通常包括标题,作者,出版商以及ISBN。例如:"Programming WCF Services by Juval Löwy. Copyright 2007 O'Reilly Media, Inc., 978-0-596-52699-3."
如果你在使用实例代码过程中发现了错误,或者希望获得上述授权,敬请联系我们:permissions@oreilly.com.
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (in the United States or Canada)
707-829-0515 (international/local)
707-829-0104 (fax)
本书的网页列出了勘误表、实例以及其它附加信息。你可以通过以下地址访问:
http://www.oreilly.com/catalog/9780596526993
关于本书技术内容的意见或疑问,可以发送邮件到bookquestions@oreilly.com。
你也可以通过以下地址联系作者:http://www.idesign.net
作者在IDesign网站上公布了本书提及的整个代码库,共计超过120个下载内容,包括WCF基础,契约设计,实例管理,操作与调用,错误,事务,并发,队列以及安全。下载内容涵盖了本书大部分能够运行的代码段。
Safari® Enabled
读者是否注意到在你喜欢的技术书籍的封底上,有一个Safari® Enabled图标。它意味着本书由O'Reilly Network Safari Bookshelf提供了在线的可用版本。
Safari提供了一套优于电子书籍的解决方案。它是一个虚拟图书馆,读者通过它可以便捷地搜索到数千本顶尖的技术书籍,剪切和粘贴代码实例,下载书中的章节,搜寻你所需要的更详尽、更准确的信息。赶快行动吧,体验就在http://safari.oreilly.com。
致谢
如果没有WCF(Indigo)项目经理们一直以来的支持与协助,我根本不可能在WCF诞生之初就能够熟练掌握这门技术。我必须感谢我的朋友Steve Swartz,作为WCF的一名架构师,他不仅仅奉献了他的学问与识见,还有他的热情,始终不厌其烦地在IM(即时通讯工具)之上与我探讨相关问题。感谢Yasser Shohoud,Doug Purdy以及Shy Cohen,感谢他们就本书作出的精彩而又重要的设计复审,同时还要感谢Krish Srinivasan,感谢他在软件工程学上如哲学家一般的真知灼见。能够与你们一起合作,是我三生有幸,也是我在学习掌握WCF过程中的重要收获。以下WCF程序员则牺牲了他们的时间,帮助我阐明了WCF这门技术:Andy Milligan, Brian McNamara, Eugene Osovetsky, Kenny Wolf, Kirill Gavrylyuk, Max Feingold, Michael Marucheck, Mike Vernal, and Steve Millet。同时还要感谢这个小组的经理Angela Mills。
除了微软的成员,我还要感谢Norman Headlam和Pedro Felix,你们给了我非常有价值的反馈。感谢Nicholas Paldino的帮助。Nick对于.NET框架的理解是独一无二的,正是因为他见微知著的细致精神,才能够保证本书的品质。
最后,我要感谢我的家人。我的妻子Dana,是你始终如一地鼓励我,让我能够写下我的所思与所得,但却牺牲了陪伴你和女儿们的宝贵时间。感谢我的父母,是你们带给了我对工程学的无尽热爱。我还要将本书献给我的两个女儿,7岁的Abigail,4岁的Eleanor。对于我而言,可爱的你们就是我的整个世界。