《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 面向Silverlight的WCF服务优化策略的设计与实现
面向Silverlight的WCF服务优化策略的设计与实现
来源:微型机与应用2011年第20期
张学林, 钟志农, 景 宁, 薛 丹
(国防科学技术大学 电子科学与工程学院, 湖南 长沙 410073)
摘要: WCF服务与Silverlight技术相结合,为高效开发RIA应用提供了新的途径。针对WCF服务技术在基于Silverlight的Web应用开发中所面临的问题,对WCF服务的Silverlight客户端调用、WCF服务继承机制的实现以及异步调用机制的同步化等关键技术进行研究,提出了相关的优化策略和实现方法,为基于WCF服务与Silverlight技术高效开发Web应用奠定了基础。
Abstract:
Key words :

摘   要: WCF服务与Silverlight技术相结合,为高效开发RIA应用提供了新的途径。针对WCF服务技术在基于Silverlight的Web应用开发中所面临的问题,对WCF服务的Silverlight客户端调用、WCF服务继承机制的实现以及异步调用机制的同步化等关键技术进行研究,提出了相关的优化策略和实现方法,为基于WCF服务与Silverlight技术高效开发Web应用奠定了基础。
关键词: WCF; Silverlight; RIA; 服务调用

    WCF(Windows Communication Foundation)是微软提出的一个面向服务的分布式分层架构,它整合了.Net平台下所有与分布式系统有关的技术,为开发各种不同环境下的分布式系统提供了一个统一、高效的方法。Silverlight(银光)是微软全力打造的一个开发面向富互联网应用程序(RIA)的基础平台,它改变了传统Web应用程序界面设计方式,能够开发出具有专业图形、音频和视频的Web应用程序,增强了用户体验。因此WCF服务与Silverlight技术的有机结合,为高效开发RIA应用提供了一种新的途径[1]。但WCF服务技术与Silverlight技术是两种不同的技术体系,在开发基于Silverlight的Web应用时,常规的WCF服务技术不能完全适应开发的要求,因此必须对其进行优化。本文针对WCF服务技术在基于Silverlight的Web应用开发中所面临的问题,对WCF服务的Silverlight客户端调用、WCF服务继承机制的实现以及异步调用机制的同步化等关键技术进行研究,提出了相关的优化策略和实现方法。
1 Silverlight和WCF简介
1.1 WCF技术简介

    WCF是微软基于SOA(Service Oriented Archit -ecture)推出的.Net平台下的框架产品,它代表了软件架构设计与开发的一种发展方向,在微软的战略计划中也占有非常重要的地位。WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架,它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有与分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ,功能十分强大。
    WCF的整体基础框架包括服务端框架和客户端框架两个部分[2]:服务端框架主要将服务以终结点的形式暴露出来供潜在的用户端消费,并且接收处理客户端服务请求、激活服务对象、执行相应的操作并返回最终结果;客户端架构显得相对简单,主要是通过服务代理完成服务请求和结果接收。二者的核心都是围绕服务契约(ServiceContract)进行的。
    一个完整的WCF服务的应用实例包括服务契约的定义、服务的实现、服务的寄宿、元数据的发布和导入、服务代理的创建和服务调用等步骤。
1.2  Silverlight技术简介
    Microsoft Silverlight 是一种跨浏览器、跨平台的.NET Framework 实现,用于为 Web 生成和提供下一代媒体体验和富互联网应用程序(RIA)。Silverlight 统一了服务器、Web 和桌面的功能,统一了托管代码和动态语言、声明性编程和传统编程以及 Windows Presentation Foundation (WPF) 的功能[3]。
    传统的Web 应用程序在浏览器中以HTML方式呈现界面,在Web 服务器端实现呈现逻辑控制和客户端状态维持,造成界面频繁刷新、状态维持困难、HTML 难以表达众多媒体元素等问题。而实现RIA应用的Silverlight 技术,使用XAML 语言描述多媒体界面,在客户端实现呈现逻辑,通过网络与分布在Internet 中的Web 服务进行通信,获取数据资源[4]。
    Silverlight能够开发出具有专业图形、音频和视频的Web应用程序,增强了用户体验。Silverlight相当于一个小型的.NET Framework,可以充分调用客户端机器的处理运算能力,使得Web页面展示如同C/S端程序一般,并且实现了无刷新,带来了更多的用户视觉与操作体验。
2 基于Silverlight与WCF的Web应用开发框架
    传统的Web应用开发一般采用典型的三层架构,主要包括数据访问层、业务逻辑层和表现层[5]。
    数据访问层实现与数据库的交互即对数据库数据增、删、改、查等操作。在一定程度上验证数据的有效性和正确性,但无法确定数据作用,不负担任何业务逻辑。
    业务逻辑层实现相应业务逻辑数据的转换处理以及生成。对流入数据的有效性和正确性进行验证,并转换成相应的流出数据,以达到业务逻辑目标。
    表现层实现用户与系统的交互,直接验证数据的有效性和正确性。它接收用户请求并返回响应数据结果的展现,而具体的数据处理则转到业务逻辑层和数据访问层进行处理。
    WCF服务技术与Silverlight技术的出现,为开发高扩展性、丰富用户交互方式的Web应用提供了更高效的方法。其中WCF 技术提供了多种高效且高可用的企业级特性,可以把传统的、独立的技术整合到一起,提供了对可靠性、事务性、并发管理、安全性以及实例激活等技术的有力支持,同时提供了简单、快捷的远程服务访问方式。通过WCF技术可有效提高应用系统的兼容性和扩展性,并降低系统内部模块的耦合度。Silverlight技术是面向RIA的客户端,为开发丰富用户交互方式的Web应用提供了支撑。因此二者的结合能够完全发挥各自的技术优势,完全符合RIA的技术要求。为此,本文针对WCF服务技术以及Silverlight技术的特点,通过扩展传统的三层Web应用开发框架,提出了基于Silverlight与WCF的Web应用开发框架,如图1所示。

 

 

    在此框架中,核心是服务层和用户控件层。其中服务层通过WCF服务的方式对业务逻辑层对象进行封装,并为外部(表现层)提供了标准的接口;表现层通过标准的通信方式调用WCF服务以实现对业务逻辑对象的访问。服务层的存在,降低了系统的耦合度,提高了系统的扩展性,并通过WCF服务的方式提高了系统的应用性能。
    用户控件层直接支撑表现层,在Silverlight客户端环境下,为表现层的开发提供了各种Silverlight控件支持。在Web应用客户端开发中,只需对一些控件进行组合扩展,便可开发出各种满足表现层页面,展示需求用户界面;通过调用服务层的WCF服务,以实现对各种业务逻辑对象的访问。通过用户控件层可大大提高用户界面的开发效率。
    另外,在Web应用开发中,可根据实际提取出一些通用方法和数据对象实体,封装为通用类库和业务数据实体类,分别作为系统开发的辅助工具类库和全局共享的数据类,以提高系统的开发效率。
3 面向Silverlight的WCF服务优化
    Silverlight技术与WCF服务的结合符合当前Web应用的开发趋势,但在面向Silverlight的Web应用开发环境下,通用的WCF调用方法、异步/同步调用机制以及WCF服务继承机制不能完全适应系统的开发要求,因此针对Silverlight对WCF服务进行优化,成为基于Silverlight技术与WCF服务技术开发Web应用的关键。
3.1 Silverlight客户端调用WCF服务的设计实现
     在WCF服务框架下,服务器端的服务不管客户端服务代理的调用方式(同步或者异步),其设计与实现始终是一致的。在客户端,WCF通过客户端创建代理进行服务的调用,服务代理对象的创建有两种方式[2]:
  一种是代理构造法,即借助相关工具导入服务元数据生成代理类。.NET环境下,面向Silverlight客户端提供的一种通用方法(“添加服务引用”)就是这种方法。此种方法实现简单,但是由于服务代理是由统一的工具生成,生成规则有限,一旦应用系统客户端代理需要统一地实现或更改,如服务契约的继承机制层级关系的恢复,就需要对每个服务代理进行手工修改,尤其对于一次产生多个服务代理对象应用的情形,这种方式效率较低且难以形成调用机制的一致化。
   另一种方法是通道工厂法,即直接使用通道工厂(ChannelFactory<T>)来调用服务操作。通道工厂法相对来说具有更好的灵活性和扩展性,更适合于系统应用的底层。但是,这种方式需要客户端共享服务契约接口的定义,一般情况下直接共享服务契约,客户端需同步调用服务操作,而Silverlight客户端不支持同步数据操作,只支持异步数据操作,因此在Silverlight客户端需要生成异步方式服务契约代理类。
   为解决上述问题,本文提出采用通道工厂法灵活创建面向Silverlight的WCF服务的统一异步机制客户端代理。创建如图2所示流程:首先发出服务操作调用请求,根据其服务类型确定服务地址即WCF服务的终结点,进而判断是否已生成相应异步方式服务契约代理类,如果没有,则先生成相应的服务代理类,然后再直接创建相应的通道工厂实例调用服务异步执行相关操作,最后返回操作结果。

    根据上述客户端服务调用流程,在客户端保留了与服务器端共享一致的服务契约代码,暴露相关服务契约类型和操作,以便客户端潜在地调用,同时设计和实现了如图3所示的客户端服务调用框架:通过ServiceCallBuilder<TService>解析服务操作请求得到相应的服务地址和调用服务的方法和参数,然后根据其服务地址和类型调用ServiceChannelFactory<TService>生成相应的异步方式服务契约代理类,进而创建相应的异步信道工厂的服务信道,最后结合ServiceCallBuilder<TService>解析的服务方法和参数,在ServiceCall<TService>中完成服务操作的异步调用。

    AsyncServiceInterfaceFactory和AsyncServiceInterface Generator是对Silverlight客户端异步方式服务契约代理类自定义生成的实现。通过应用Silverlight客户端WCF代理自动生成程序集文件(Silverlight.WCF.AutoGeneratedAsyncInterface.dll)采用反射机制,利用AsyncServiceInterfaceFactory类加载WCF服务契约类型和Silverlight客户端WCF代理自动生成程序集文件,然后调用AsyncServiceInterfaceGenerator中的自定义的Generate方法生成异步服务契约代理类型和该类型中异步操作的方法,并返回创建的异步服务契约代理类型,为客户端调用提供接口。
    以这种方式实现客户端代理服务的异步方式的可控生成,显然比代理构造法的工具生成服务契约代理类具有更好的灵活性和扩展性。
3.2  WCF服务继承机制的实现
    面向对象的设计原则对于WCF服务设计来说在系统开发中有着重要的借鉴价值和实际价值,尤其是WCF服务的继承机制的实现对于提高系统的开发效率有着重要的作用。虽然服务契约的定义与接口定义类似,但由于WCF框架自身的限制,WCF契约属性是不支持继承的[6]。
    在服务器端契约继承关系上,利用.NET环境本身对接口继承的支持,只需要在多层服务契约接口定义时,在每层接口上标记其相应的服务契约属性(ServiceContract),以支持WCF服务契约属性。
    然而,代理构造法生成的客户端服务代理的创建一般无法还原服务端契约的层级关系,这必须通过手工修改代理并导入服务契约的定义,恢复契约层级。实际系统开发中这种手工恢复的方式大大增加了工作量和复杂度。而采用3.1节中所提出的方法生成的Silverlight客户端服务代理,可以很方便地完成继承机制的统一实现。
    由于客户端对WCF服务的调用并不会影响服务器端,一个WCF服务的客户端代理只需要有其所继承的上层基类的操作契约,维持相应操作契约的特有属性,则不需要恢复层级关系就可以实现对服务端上层基类操作的调用。为此,本文设计创建BaseServiceInterface类在客户端启动时结合与服务器端共享的服务契约代码,注册所有基类。对于一个WCF服务,可利用3.1节所提到的客户端异步方式服务契约代理类的生成类AsyncServiceInterfaceGenerator中的Generate方法所调用的自定义方法(GetOperationContra -ctMethods),判断是否属于相应基类的派生类,并生成所属基类和自身服务契约所有操作异步方法及操作契约属性。这样就完全统一实现了客户端服务代理的继承机制。
3.3  异步调用机制的同步化
    Silverlight客户端是通过异步方式来调用WCF服务的,但是对于一些应用又需要采用同步的方式来调用服务,如一些严格要求业务流程的应用系统。为此,本设计采用C#迭代器,实现了异步调用机制的同步化,来满足同步调用服务的应用开发需求。
    C#迭代器可以返回相同类型的有序代码块,通过这些代码块能够实现特定的处理功能。迭代器代码块与普通代码块类似,只是迭代器代码块中存在不定量的yield语句。其中,yield return语句生成迭代下一个值;yield break语句设置迭代终止完成。即关键字yield用于设置返回值,当程序达到yield return语句时,会保存当前的位置。当下次调用迭代器时,将从这个位置重新开始执行。只要函数成员的返回类型是枚举器接口或者其中的一个,迭代器就可以用作函数成员体。
    针对C#迭代器的特点,定义了一个如图4所示的IAction接口作为枚举器的执行元素,封装了一个执行函数(Excute)和一个完成事件(Completed),自定义ServiceCall<TService>抽象类实现IAction接口,通过执行函数封装客户端异步调用服务的全过程并返回当前主线程触发所注册的完成事件。其派生类ServiceCommand<TService>和ServiceQuery<TResult, TService>则是由具体的服务操作执行结果衍生出的返回操作结果的两种方式。

    同时设计了一个ServiceRun类封装迭代器IAction元素执行细节。具体实现流程如图5所示。

    由于所设计流程是一个迭代循环的过程,在调用ServiceRun类的同时自动调用一个空的IAction元素的完成事件,以达到启动迭代器的目的。可以看出服务的调用完全通过迭代器内的元素执行,通过yield return返回结果,回归主线程后才会继续执行后续代码,基本实现了WCF服务在Silverlight客户端异步调用同步返回,并且维持了WCF服务调用的稳定性。
    本文针对基于WCF和Silverlight典型的Web应用框架对WCF服务的应用限制,在.NET环境下,设计并实现了面向Silverlight的WCF服务客户端代理通道工厂的方案。在该方案的基础上,按照面向对象的基本原则,实现WCF服务的继承机制;采用C#迭代器机制,完成Silverlight客户端异步调用的同步化。这些优化进一步发挥了Silverlight技术在RIA设计方面的技术优势,以及WCF服务自身强大的功能优势,使得该框架具有更高的复用度和扩展性,能显著提高相关应用系统的开发效率和性能。
参考文献
[1] STEARN B. A new approach for developing rich internet  applications[J]. IEEE Internet Computing, 2007,11(3):67-73.
[2] 蒋金楠. WCF技术剖析(卷一)[M]. 北京:电子工业出版社,2009:366-367.
[3] 魏永超,银光志[M]. 北京:清华大学出版社, 2009:4-7.
[4] 程国雄,胡世清. 基于Silverlight互动学习RIA平台的研究与实现[J]. 计算机工程与科学, 2010,32(7):23-26.
[5] 王非. RIA系统研究与实现[J]. 微计算机应用,2005, 17(5):100-104.
[6] 张金星.基于WCF的软件开发过程中若干问题的研究[D]. 吉林:吉林大学, 2010.  (收稿日期:2011-07-22)
 

此内容为AET网站原创,未经授权禁止转载。