[WCF-Discovery]让服务自动发送上/下线通知[实例篇]
2011-10-25 12:00
716 查看
在《原理篇》我们对客户端如何监听通知,以及服务在上下线时如何发送通知从原理上进行了深入地剖析。我们现在通过一个简单的实例演示如何通过ServiceDiscoveryBehavior服务行为为寄宿的服务添加一个实现上/下线通知的AnnouncementEndpoint终结点,以及客户端如何通过对AnnouncementService服务的寄宿实现对通知的监听和接收。[源代码从这里下载]
我们采用如右图所示的解决方案结构,其中Service.Interface、Service(控制台程序)和Client(控制台程序),用于用于定义服务契约、服务类型(服务寄宿)和客户端监听程序。并且直接使用我们熟悉的CalculatorService。现在我们为该服务的寄宿定义如下一段配置。我们定义了一个包含ServiceDiscoveryBehavior行为的默认服务行为,并且一个UdpAnnouncementEndpoint终结点被添加到了ServiceDiscoveryBehavior的AnnouncementEndpoints集合之中。
[code] <configuration> <system.serviceModel> <services> <service name="Artech.WcfServices.Service.CalculatorService"> <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="ws2007HttpBinding" contract="Artech.WcfServices.Service.Interface.ICalculator" /> </service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceDiscovery> <announcementEndpoints> <endpoint kind="udpAnnouncementEndpoint" /> </announcementEndpoints> </serviceDiscovery> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
[/code]
然后通过如下一段简短的代码对CalculatorService进行寄宿,与之前的不同之处在于输出了一段程序退出的提示性文字。当服务寄宿程序启动后输入任何字符,服务将会被关闭(离线)。
[code] using System; using System.ServiceModel; namespace Artech.WcfServices.Service { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Open(); Console.WriteLine("Enter any key to exit."); Console.Read(); } } } }
[/code]
接下来我们需要在客户端通过寄宿AnnouncementService服务来监听CalculatorService服务启动和关闭自动发出的通知。我们先通过如下所示的一段配置为寄宿的AnnouncementService添加一个UdpAnnouncementEndpoint终结点。
[code] <configuration> <system.serviceModel> <services> <service name="System.ServiceModel.Discovery.AnnouncementService"> <endpoint kind="udpAnnouncementEndpoint" /> </service> </services> </system.serviceModel> </configuration>
[/code]
AnnouncementService服务通过如下的代码进行寄宿。由于AnnouncementService被定义成一个单例服务,我们就可以直接针对一个预先创建好的AnnouncementService实例来创建用于服务寄宿的ServiceHost。在服务开启之前,我们注册了AnnouncementService的OnlineAnnouncementReceived和OfflineAnnouncementReceived两个事件,在它接收到目标服务上/下线通知的时候会输出目标服务终结点的地址和契约名称。
[code] using System; using System.ServiceModel; using System.ServiceModel.Discovery; namespace Artech.WcfServices.Client { class Program { static void Main(string[] args) { AnnouncementService announcementService = new AnnouncementService(); announcementService.OnlineAnnouncementReceived += (sender, e) => { string contractTypes = string.Empty; Console.WriteLine("Receive Service Online Announcement."); Console.WriteLine("\tAddress: {0}", e.EndpointDiscoveryMetadata.Address.Uri); Console.WriteLine("\tContract: {0}", e.EndpointDiscoveryMetadata.ContractTypeNames[0]); }; announcementService.OfflineAnnouncementReceived += (sender, e) => { string contractTypes = string.Empty; Console.WriteLine("Receive Service Offline Announcement."); Console.WriteLine("\tAddress: {0}", e.EndpointDiscoveryMetadata.Address.Uri); Console.WriteLine("\tContract: {0}", e.EndpointDiscoveryMetadata.ContractTypeNames[0]); }; using (ServiceHost host = new ServiceHost(announcementService)) { host.Open(); Console.Read(); } } } }
[/code]
客户端和服务端所有的配置和编码工作完成之后,先启动客户端开启通知监听服务。然后开启服务端启动服务CalculatorService,最后输入任意键(不要直接关闭控制台窗口)退出服务端程序。此时你会发现客户端的控制台上具有如下的输出。这段文字的第一部分代表CalculatorService启动的时候(ServiceHost的Open方法被执行之后)发出的上线通知,后一部分代表服务关闭(ServiceHost的Dispose方法执行之后)发出的离线通知。
[code] Receive Service Online Announcement. Address: http://127.0.0.1:3721/calculatorservice Contract: http://www.artech.com/:ICalculator Receive Service Offline Announcement. Address: http://127.0.0.1:3721/calculatorservice Contract: http://www.artech.com/:ICalculator
[/code]
相关文章推荐
- [WCF-Discovery]让服务自动发送上/下线通知[原理篇]
- [WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
- 定时 监控 shell 服务宕机自动重启,并发送短信通知
- [WCF REST] 一个简单的REST服务实例
- git 远程版本库,github提供服务原理,git自动更新发送邮件
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- Android中实现开机自动启动服务(service)实例
- [WCF-Discovery] 客户端如何能够“探测”到可用的服务?
- git 远程版本库,github提供服务原理,git自动更新发送邮件
- git 远程版本库,github提供服务原理,git自动更新发送邮件
- 使用job自动抓取网页数据发送邮件,以springboot服务启动
- WCF4.0 –- RESTful WCF Services (实例) (并发同步服务 SyncService)
- 热门话题:使用WCF实现SOA面向服务编程(二)——实现简单的WCF开发实例
- spring eureka 服务实例实现快速下线快速感知快速刷新配置解析
- WCF - 服务实例管理模式
- 检测tomcat服务,实现崩溃自动重启并发送邮件提醒
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]
- 阿里云ContOS通过SSH登录自动发送通知邮件
- git 远程版本库,github提供服务原理,git自动更新发送邮件