SOA 观念提出后,经过多年的时间终于开始发酵。微软世界里因 WCF 的出现,简化了实做的基础。SOA 强调如下的重点:
l 一切技术遵循公开标准
l 服务定义的边界明确
l 服务自主而不受制于其他服务
l 服务间只共享合约和原则
这些概念既抽象,实际设计与撰写也很繁琐,且维护不易,WCF 则尽量将我们所需要开发的商业逻辑与 SOA 的基本要求分开。系统开发人员依然专注在使用者的需求,若要满足 SOA 的特性,仅需要照着 WCF 的规范提供定义后,就交由平台去负责。
换句话说,要落实 SOA 的概念,需要容易开发自定服务的整合环境与执行平台。在强调组装、重用与整合下,程序如何遵循标准,共享数据合约和服务合约,而非绑死在基本数据型态和类别?在开放架构下,跨异质型平台的沟通变成是基本,如何弹性、安全、有效率地沟通?当上述问题变成是基本需求,则根稳固才会枝繁叶茂。微软就此推出了 WCF,为架构工程师和程序设计师清除了底层的障壁。
什么是 WCF
WCF 全名是 Windows Communication Foundation,程序代码名称为 ”Indigo”,是建立在 .NET 上的应用程序沟通框架,集微软分布式应用经验之大成。整合了 .Net 平台和分布式计算相关的技术,如.Net Remoting、Web Service/WSE/WS-*、分布式交易(.NET Enterprise)和讯息处理(MSMQ),以及以往的 COM+/DCOM 等技术。提供开发者建立跨平台、安全、可信赖、交易管理的解决方案,且与既有系统兼容。
WCF 内建于.Net Framework 3.0。Windows Vista 及 Windows 2008 操作系统会预含该架构。而 Windows XP 和 Windows 2003 操作系统也可以单独安装 .NET Framework 3,0 Runtime。现今通行的 Visual Studio 2005 中并没有包含WCF,但可自微软的网站下载 Visual Studio 2005 extensions for .NET Framework 3.0,以方便开发架在 WCF 上的系统。
WCF 总体架构如图 1 所示:
图 1:WCF 的总体架构
WCF 规范你在写商业逻辑前,要先制定程序间沟通时所需的合约,如数据合约、服务合约、讯息合约等。接着,透过设定 behavior 你可以调整 WCF runtime 如何搭配你的服务执行,例如是否要提供 WSDL 说明给前端,是否传回完整错误讯息…等。
就程序或系统间的沟通而言,WCF 可以跨程序(Process)、机器、局域网络、乃至于因特网。以 WCF 为基础的服务,其宿主(Host)程序可以是 IIS、ASP.NET,EXE,Windows Service,COM+…等。WCF 支持的网络协议包括 SOAP、HTTP、Named Pipe、TCP…等,而它提供的安全机制包括各种加解密算法、SAML、Kerberos、X509、账号/密码等多种标准与模式,你也可以自定义协议与安全机制,以延伸其功能。
另外,图 1 中 Messaging 区块内的 Channel 代表传输时,各种功能的堆栈。虽然是画在一起,但逻辑上有层次之分,例如 Transaction Flow 最高,Reliable 次之,Security 再次之,而 HTTP、TCP、Named Pipe 同属底层的传输协议。
总而言之,WCF将所有与程序沟通相关的技术都包含在内,并替你实做了 OASIS 组织所定义一堆的 WS-* 标准规格[1]。而熟悉 WCF 是简化 SOA 开发的第一步。
WCF 的优点
概括地说,WCF具有如下的好处:
l 统一:如前所述,WCF 整合微软历来分布式开发的技术。
l 相容:充分与旧有系统兼容。安装WCF并不会影响企业内原有的技术,且仍可与其沟通。
l 整合:WCF支持多种通信协议以保证系统间的互操作性,且期待经由标准的 WS-*/Web Service/SOAP 等规格,可跨异质型平台整合。
l 安全:支持 WS-* 所规范的多种安全机制,如 WS-Security,WS-Trust 和WS-SecureConversation 等标准,以用于用户认证,数据完整性验证,数据隐私等多种安全议题。
l 可信赖的讯息沟通:一般对可信赖的讯息沟通之要求可大分为两部分,一是安全,另一是两端收发讯息的质量。安全的部分如前点所述,WCF 同时支持 WS-ReliableMessaging、WS-Addressing 标准,提供可信赖的端对端通信[2]。同时还支持 MTOM 规格(讯息传输优化机制,Message Transmission Optimization Mechanism),让大型二进制数据可以有效地传递。
l 整合队列(Queue):上述讯息质量指的是两端应用程序同时在在线之端对端沟通。而 WCF 也支持透过队列(Queue)传递讯息,让两端不必同时存在同一时空中。
l 交易管理:建立在 WS-Coordination 和 WS-AtomicTransaction 标准之上,以整合异质型平台的交易,提供分布式交易所需的两阶段完成交易协议(two-phase commit transactions)。
l 简化开发:让以往需徒手撰写的功能改以设定启动(依据微软举的例子,将原本需撰写 56296 行的程序代码简化成 3 行程序代码,4 行设定)。
光是表列这么多 WCF 的好处当然不够J,上图 1 的架构也非三言两语可以道尽。在此介绍一本关于 WCF 的好书「Microsoft Windows Communication Foundation Step by Step」,作者是 John Sharp,Microsoft Press 出版。它有着 Step by Step 系列书籍的特征,就是藉由许多实做范例导引你。但不同的是,本书所援引的技术广且深[3]。
书籍内容
本书共有十六个章节,利用前三章介绍了 WCF 的基本原理,其余针对不同的需求面向,深入解释并辅之以实做。第一章以简单范例启始,用架在 WCF 上的用户端应用程序呼叫服务。第二章介绍透过 .NET Framework 3.0 的 System.ServiceModel.ServiceHost 类别来承载我们所撰写的服务,但由于它只是一个类别,自己不会执行。作者进一步示范如何撰写 WPF 以及 Windows Service 两种应用程序类型来加载先前撰写的服务。
当系统整合时,会潜藏很多的不确定因素,因为每个系统开发团队对需求与规格的认知不同,技术能力良莠不齐,自然会有很多的例外错误。但这些错误需要在异质平台间传递,因此 WCF 需要能将 .NET Framework 的 Exception 改以 SOAP Fault 来呈现,这是第三章所要强调的主题。其内并示范如何在定义 DataContract 后,再传回自定义的错误结构。
第四章讨论当使用者端与服务端透过网络沟通时,如何保护其安全。在这章中,你可以了解到仅透过设定,藉由 WCF 已经提供的完备功能可以轻易完成验证、签章、加解密等机制。第五章则延伸安全的讨论到因特网。
第六章主要在介绍服务和数据合约的版本控管,以及建议更新版本的做法。第七章介绍如何在伺服端维护用户端的状态,但这与服务实例的生命周期密切相关。第八章讨论分布式交易,透过简单的范例程序代码说明如何在前端程控交易,但可惜对于异质型平台的分布式交易着墨不多。第九章介绍如何维持通信质量,同时藉由保证讯息顺序的唯一标识/编号和失效等机制,可以防止黑客的回放攻击(replay attack)。
第十章讨论如何藉由程序来设定与管理 WCF 所提供的功能,也解释了图 1 中 Service Runtime 和 Messaging 两个区块。第十一章讨论单向(OneWay)与异步两种沟通方式,这与使用者端是否需要服务器端的响应,以及两者间是否需要同步处理单一需求有关,设计的好坏将影响整体系统的效能和前端程序的流畅与否。第十二章探讨为保证资源有效使用而提供的流量限制,以及传递如多媒体数据等大型二进制数据时,使用的 MTOM 规格。第十三章介绍讯息的绕送,并据此示范经由绕送使用者端的需求来达成负载平衡(load balance)。第十四章说明从服务器端反向呼叫使用者端,这需先在服务器端定义回呼合约(Callback contract),并由使用者端实作。当服务器端发生了使用者端有兴趣的事件时,可以反过来呼叫用户端的程序。
第十五章介绍了 .NET Framework 3.0 引进的 Windows CardSpace 技术,以验证使用者的身分。经由实做,让笔者从懵懂进而理解其架构,以及如何整合凭证(Certificate)来保证双方的安全。本书的最后一章解释如何将以往用 ASP.NET 开发的 Web Service;或是 .NET Enterprise 开发的 COM+ 移转到 WCF,藉以保障先前的投资。
阅读建议
本书的章节内容蛮独立的,循着前三章走完范例,了解 WCF 的基本架构后,就可以选取你有兴趣的主题阅读。
由于 Visual Studio 2008 还未正式发行,你使用的可能是 Visual Studio 2005 版本,要执行本书的范例前,务必参考 Introduction 章节介绍,安装必要的程序对象,否则书中的范例将无法使用。
此书上市之时,书内范例所引用的 Microsoft Enterprise Library 版本是 2.0 – January 2006,而现今在微软网页下载(http://msdn2.microsoft.com/en-us/library/aa480453.aspx)的最新版本已经变成Enterprise Library 3.1 – May 2007 (for .NET Framework 2.0 and 3.0),若你下载的是最新版本,则范例程序代码所呼叫的对象会有版本问题。一般来说,你只要将服务或是服务的宿主程序所使用之 app.config 档案内容,如下的部分稍做修改即可:
, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
你可以参照该对象的版本特征来修改上述粗体字的部分,但最简单的方式应是将其删除即可。
本书在说明时多辅之以范例,而范例设计成填空题,清楚解释操作步骤,让你仅撰写或复制/贴上关键的程序代码即可。章节之间的部分范例有关连性,若能跟着章节走,对范例较能融贯。
本书所涵盖的面向相当广泛,程序设计新手阅读起来可能会有点辛苦。换言之,你是个使用 Visual Studio 2005 的 C# 程序老手,且有网络结构、交易管理、安全等基本知识,则 WCF 将是一个工作利器。当然,若你是系统分析设计人员,或是架构工程师,也可以透过此书了解一下分布式系统应注意的事项。
相关阅读
除了本书之外,笔者列出些与 WCF 相关的资源供你参考:
l 微软对 WCF 的主网页:http://wcf.netfx3.com/,MSDN 对 WCF 的主网页:http://msdn2.microsoft.com/en-us/netframework/aa663324.aspx。
l 制定 WS-* 标准的 OASIS (Organization for the Advancement of Structured Information Standards) 组织的首页:http://www.oasis-open.org/home/index.php。
l 另一本关于 WCF 不错的书:Inside Windows Communication Foundation,出版社 Microsoft Press,作者 Smith。这本书只有本文介绍的书三分之二的厚度,单就 WCF 本身介绍,并未延伸讨论。
最后,就个人对 WCF 的感觉是:我们实做信息系统的技术依然建立于 .Net 之上,以面向对象/组件导向的设计方式融入服务导向的精神后,WCF 将可简化与商业逻辑无关的部分。明年(2008/3月) Visual Studio 2008(Orcas) + Windows 2008(Longhorn) + IIS 7出来后,新一代的 AP Server 可以便利地整合 WCF,也有一致的开发与设定方式,分布式系统将有一番新气象。
[1] WS-* 是非常多标准规格的总称,由 OASIS 制定,后文中提及以 WS- 开头的标准规格皆属于此。
[2] 也就是有效绕送并保证讯息寄达、不会重复收取,以及按顺序接收讯息等。若实在无法寄达,发送端也会收到例外错误。
[3] 似乎一旦触及整合,不可免地就要深入了解五花八门的技术。WCF 透过设定或许可以简化系统设计开发人员的程序撰写工作,但其本身提供的设定多如牛毛,若不提纲挈领地了解各种技术概念,根本不会设定。