MSRS与WinForms应用通过WCF服务的协作示例

在几个月前首次预发布的MSRS,即将成为一个强大的工具,不仅用于机器人控制,还用于广泛的面向服务的应用。其并发和协调运行时(CCR)大大简化了同时进行和相互关联任务的开发,并提高了应用程序的响应性。

去中心化系统服务(DSS)为开发者提供了轻量级的基于服务的工具,以编写和协调分布式应用程序。尽管MSRS支持Web用户界面,甚至允许在DSS服务内部运行WinForms,但MSRS服务与非MSRS应用程序之间的通信可能是可取的。特别是,当基于MSRS的服务器响应远程非MSRS客户端时,需要这种通信。本文介绍了这种通信的一个示例。连接是使用.NET 3.0 Windows通信基础(WCF,以前称为"Indigo")服务进行的。基本熟悉MSRS和WCF是必要的。除了微软文档外,文章末尾的参考文献段落还提供了一些有用的链接。

代码示例

本文的代码示例由四个项目组成(见图片)。其中三个,即PerformanceMonitor、FileWatcher和Coordinator,是同一个DSS主机(节点)的DSS。这些服务与实际的机器人控制无关。相反,完全符合它们的名字,PerformanceMonitor定期测量%处理器时间性能计数器,FileWatcher监听给定磁盘目录中的变化,Coordinator协调前者的活动,并充当这个DSS节点到外部世界的网关。闪亮的外部世界由第四个项目TheForm代表,这是一个WinForms应用程序。

TheForm和Coordinator通过WCF服务进行通信。每一方都实现了自己的自包含WCF服务,并创建了一个代理来连接对方。TheForm实现了一个WCF服务Notification,其URI包含通知本身和服务元数据导出的端点。该服务提供了一个接口(在WCF术语中[ServiceContract])TheForm.INotification,由TheForm.Notification类实现。该服务在App.config文件中定义,并在TheForm.Helper类的StartNotificationService()方法中打开。DSS Coordinator有自己的自包含WCF服务Coordinator http://<机器>:19190/Coordinator,与[ServiceContract] Robotics.Coordinator.ICoordinator(文件CoordinatorServiceType.cs)一起,在Robotics.Coordinator.CoordinatorServiceHost类中以命令形式打开。上述WCF服务的客户端代理是使用SvcUtil.exe实用程序生成的。适当的命令文件包含在Coordinator(文件NotificationProxyGenerator.cmd)和TheForm(文件CoordinatorProxyGenerator.cmd)Visual Studio项目中。这些文件中的命令在服务运行时提取服务元数据。

由Coordinator DSS托管的WCF服务接收TheForm UI控制台发送的命令。为了简单起见,它只有一个[OperationContract] ICoordinator.Command(),带有两个参数:一个命令名字符串和一个特定于每个命令的无类型(object类型)命令数据。示例中只有三个这样的命令:"通知"使Coordinator DSS成为TheForm的Notification WCF服务的客户端,"设置监控周期"用于PerformanceMonitor DSS,"设置监视目录"用于FileWatcher DSS。"通知"命令使DSS Coordinator成为Notification WCF服务的客户端,并在通知事件发生时调用[OperationContract] TheForm.INotification.Notify()。

如上所述,Coordinator DSS控制此解决方案中其他DSS服务的活动,从它们那里获取通知,并反过来通知TheForm应用程序。因此,Coordinator DSS为PerformanceMonitor设置了周期,并为FileWatcher设置了监视目录。这是通过包含对PerformanceMonitor和FileWatcher代理的引用(分别是FileWatcher.Y2006.M09.Proxy.dll和PerformanceMonitor.Y2006.M09.Proxy.dll)并发布Replace动词到它们的主要端口来实现的,以用新数据替换服务状态(见实现接口IDssCommand的类在文件Commands.cs中)。PerformanceMonitor的ReplaceHandler()更新PerformanceMonitorState.timeout,有效地改变了监控周期。类似地,FileWatcher的ReplaceHandler()更新FileWatcherState.watcherRootDir,设置一个新的目录来监听。PerformanceMonitor和FileWatcher DSS向其订阅端口发送通知。不同DSS在同一DSS节点内通信的机制在Microsoft Robotics Studio CTP中附带的ServiceTutorials中解释(或更确切地说是"展示")。

在这个示例中,不在乎DSS的安全限制。因此,为了允许DSS使用性能计数器,监听磁盘目录中的变化,并与WCF手段通信,目前取消了安全限制(通过注释掉所有DSS中派生自DsspServiceBase的类的[PermissionSet]属性)。为了简单起见,示例中只使用了WCF服务的同步调用。由于示例旨在展示概念,错误处理是原始的。

代码源安装

首先确保机器上安装了.NET 3.0(目前是2006年8月的RC)和MSRS(目前是2006年10月的CTP)。然后将源代码解压缩到MSRS主目录下的_MsrsWcfWorkTogether目录,启动Microsoft Robotics Studio命令提示符,转到_MsrsWcfWorkTogether目录并运行DevEnv.cmd文件。VS 2005将打开并加载WCFConn.sln。检查项目属性。所有项目的输出路径应为..\..\..\bin\services\。对于DSS服务,设置应如下:

Start external program: <Microsoft Robotics Studio main directory>\bin\DssHost.exe Command line arguments: -port:50000 -tcpport:50001 -manifest:"_MsrsWcfWorkTogether/WCFConn/Coordinator/Coordinator.manifest.xml" Working directory: <Microsoft Robotics Studio main directory>

按照以下顺序构建解决方案。首先,构建FileWatcher和PerformanceMonitor项目。然后确保Coordinator有适当的引用FileWatcher.Y2006.M09.Proxy.dll和PerformanceMonitor.Y2006.M09.Proxy.dll,并构建Coordinator项目。构建TheForm项目。使用文件RunTheForm.cmd和RunCoordinator.cmd运行相应的应用程序。对于未来的MSRS版本,请使用推荐的转换程序。

演示安装

将演示解压缩到目录<Microsoft Robotics Studio main directory>\bin\services并执行RunCoordinatorFromSvc.cmd和RunTheFormFromSvc.cmd文件。

注意:这个演示项目适用于上述指定版本的MSRS和WCF。

本文介绍了MSRS服务与WinForms应用程序通过WCF服务进行协作的示例。WCF为开发者提供了一系列的传输适配器通道(HTTP、TCP、命名管道、对等和MSMQ),作为发送者和接收者之间传输消息的手段。因此,使用WCF进行通信的能力大大扩展了MSRS服务的能力,特别是作为服务器引擎。

Sara Morgan Rea. 编程机器人入门与Microsoft Robotics Studio.

Jeffrey Richter. 并发事务:并发和协调运行时.

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485