基于WCF的Silverlight绘图聊天程序实现
2015-06-24邹珺
摘要:WCF技术能实现聊天功能。结合WCF服务配置以及Silverlight客户端定义,调用WCF服务器端代理类,完成了绘图功能和聊天记录的发送。通过WCF的双向通信机制实现了Silverlight绘图聊天程序。
关键词:WCF;Silverlight;代理类;双向通信;绘图聊天
DOIDOI:10.11907/rjdk.151124
中图分类号:TP3-0
文献标识码:A 文章编号
文章编号:16727800(2015)006005402
作者简介作者简介:邹珺(1981-),女,江苏苏州人,硕士,苏州农业职业技术学院讲师,研究方向为.NET软件开发。
0 引言
WCF(Windows Communication Foundation,Windows通信基础)属于.NET Framework框架中的通信层子框架,是微软推出的用于开发面向服务架构SOA应用程序的基础框架,整合了各种不同的分布式开发技术,例如Web服务、.NET远程处理及Enterprise Services[1]等。
1 WCF技术概述
1.1 WCF技术开发模型
WCF作为基于SOA面向服务架构的一个通信框架产品,主要用于创建应用程序服务,而一个WCF服务又包含称为ABC的3个部分。
A是Address的简称,用于指定服务地址。每个WCF服务都有一个唯一的地址,该地址定义了服务的引用地址和传输协议。
B是Binding的简称,中文称为绑定。因为可供通信的方式很多,比如可以是单向或双向的通信,可以使用HTTP、TCP、P2P或IPC等。绑定提供了一些用于通信的封装好的方式。
C是Contract的简称,中文称为契约,描述了服务所能提供的各种服务。
WCF简化了开发分布式应用程序的复杂性,让开发人员不再过度关注复杂的通信协议及数据交换,将所有精力放在业务逻辑的实现上[2]。
1.2 绘图聊天程序预览效果
打开聊天程序,要求用户输入一个名字进行登录,便于聊天室知道当前聊天人员的信息,单击“登录”按钮后,打开聊天程序的主窗体。
主窗体左侧是绘图面板,底部是供绘图的工具,包括画笔、画刷和基本形状工具。顶部标题栏下是位置区,用户可以设置线程、画刷颜色和画刷粗细等样式,右侧文本框用户可以输入聊天信息,当用户单击“发送聊天信息”按钮后,用户的聊天信息将在所有的客户端显示。
用户在绘图区域绘图时,所有使用该Silverlight聊天程序的客户端都会实时显示出绘图笔记。当有新用户登录或进行绘图操作后,聊天室底部的状态栏面板上会显示通知信息,可以知道当前是哪位用户在绘图板上绘制了图形。
2 WCF服务器功能设计
2.1 定义WCF服务契约
WCF服务将宿主到IIS中,创建一个标准的用于承载Silverlight的ASP.NET项目:右击该项目名称,选择“添加”|、“新建项”命令,在弹出的“添加新项”窗口中,选择WCF服务项,命名为DuplexDrawService.svc,VS会自动向项目中加入一个svc文件和一个IDuplexDrawService的契约定义文件。
为了让客户端发送的消息能在多个客户端窗口之间同步,使用WCF双向通信绑定。双向通信原理是:一般获取数据使用的是客户端调用服务端的方法来获取数据,而Duplex是将客户端也当作服务器,客户端上的方法一样可以使用。
每当客户端通过HTTP协议连接到服务器端后,会向服务器注册一个该客户的名称和回调接口到服务器端的字典中。当客户端发送聊天内容或者进行绘制时,服务器端将查询已连入的客户端,使用回调机制调用客户端的更新方法将数据推送到Silverlight客户端,达到在一个地方发送信息,所有客户端都能保持同步的效果[3]。
2.2 定义WCF回调契约
IDuplexDrawCallback接口用于定义WCF服务的回调契约,该接口向服务器端发送更新通知。
2.3 实现服务契约
IDuplexDrawService接口用来向客户端发布WCF服务,项目中的DuplexDrawService类提供IDuplexDrawService接口的实现。在类的声明中,使用WCF服务为ServiceBehavior定义在客户端调用服务器端的行为[4]。
2.4 配置WCF服务器
为了让客户端可以访问,还需要定义WCF服务地址和绑定。
(1)为了实现WCF的双向绑定,需要引入System.ServiceModel.PollingDuplex.dll这个程序集,该程序集位于Silverlight SDK中。
(2)需要在Web.config配置文件中添加对该程序集中定义的绑定扩展,用户可以使用绑定扩展来创建用户定义的绑定元素,并将其作为自定义绑定的一部分来使用。绑定扩展时实现抽象类BindingElement的类型[5]。
(3)用户可以使用绑定扩展bindingExtensions来创建定义的绑定,并将其作为终结点配置的一部分来使用。扩展绑定是一个实现抽象类Binding的类型。在指定了绑定元素和绑定扩展后,可以创建一个自定义的绑定类型。
(4)配置中指定使用HTTP传输协议和二进制消息编码,并指定了查询的一些参数设置。在定义绑定后,接下来定义服务行为来指定一些细节信息。
(5)定义服务ABC,指定地址、绑定和契约,让客户端可以使用特定的地址访问到服务。
(6)出于安全考虑,Silverlight不支持跨域访问服务,需要在WCF的根目录下放置一个XML策略文件,文件名为clientaccesspolicy.xml。
通过上述定义,Silverlight客户端就可以使用与其宿主ASP.NET文件路径一致的方式访问服务了。
3 Silverlight客户端功能设计
3.1 添加对WCF服务的引用
右击Service References文件夹,从弹出的菜单中选择“添加服务引用”命令,弹出添加服务引用对话框,单击窗口上的“发现”|、“解决方案中的服务”按钮,服务列表会列出在服务器端项目中已经定义好的WCF服务。
在服务的元数据中,对于定义在回调接口中的异步Notify()方法也提供了封装。单击确定按钮后,会生成一个服务代理类位于Reference.cs文件中,这个代理类包含了WCF服务的同步或异步调用代码,在客户端只需要调用这些代码就可以与WCF服务进行交互[6]。
3.2 实现DuplexClientHelper服务代理类
DuplexClientHelper使用PollingDuplexHttpBinding与服务器端进行通信,DuplexDrawServiceClient类提供了调用远程服务器对象的代码,它提供了对远程服务器端操作契约方法的定义。DuplexClientHelper简化了客户端直接操作该代理类的复杂性,提供了一层封装[7]。
3.3 实现绘图处理
3.4 聊天记录发送
DrawingArea对象的AddObjects()方法中,如果ScreenObject类型是Text时,会根据文本内容实例化一个TalkItem对象,添加到ObservableCollection
用户在聊天文本框中输入聊天内容、单击“发送聊天信息”按钮时,聊天记录被添加到MessageCollection集合中,然后一个异步的DrawAsync向服务器端发出,服务器端将回调所有客户端通道,发送聊天通知信息。
4 结语
通过使用Silverlight与WCF的双向通信技术,实现了一个具有绘图功能的聊天程序,其关键技术点在于WCF的双向通信技术实现了服务器端向客户端推送数据功能[8]。
参考文献:
[1]谭淇.基于WCF服务框架与Silverlight的Web应用研究[J].计算机与现代化,2011(1):8990.
[2]张学林,钟志农,景宁,等.面向Silverlight的WCF服务优化策略的设计与实现[J].微型机与应用,2011(20):1314.
[3]黄森,刘丰.基于WCF的数据流传输方案研究与应用[J].计算机安全,2009(12):3638.
[4]彭新,刘永伟,叶长春.基于Flex和.NET开发RIA[J].软件导刊,2010(6):127129.
[5]李文滔.基于WCF架构的应用开发研究[J].计算机时代,2011(2):3436.
[6]安磊,吴英俊,黄昕颖,等.基于Silverlight和WCF技术的实时数据图形展示系统研究[J].浙江电力,2011(8):6569.
[7]张若君,王力生.Silverlight与数据模型设计模式[J].科技传播,2011(22):2125.
[8]李爱民,刘晶,马维纲.Silverlight相关技术研究[J].计算机技术与发展,2009(6):113115.
责任编辑(责任编辑:杜能钢)