博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[WCF-Discovery]让服务自动发送上/下线通知[实例篇]
阅读量:7049 次
发布时间:2019-06-28

本文共 3930 字,大约阅读时间需要 13 分钟。

在《》我们对客户端如何监听通知,以及服务在上下线时如何发送通知从原理上进行了深入地剖析。我们现在通过一个简单的实例演示如何通过ServiceDiscoveryBehavior服务行为为寄宿的服务添加一个实现上/下线通知的AnnouncementEndpoint终结点,以及客户端如何通过对AnnouncementService服务的寄宿实现对通知的监听和接收。[源代码从下载]

我们采用如右图所示的解决方案结构,其中Service.Interface、Service(控制台程序)和Client(控制台程序),用于用于定义服务契约、服务类型(服务寄宿)和客户端监听程序。并且直接使用我们熟悉的CalculatorService。现在我们为该服务的寄宿定义如下一段配置。我们定义了一个包含ServiceDiscoveryBehavior行为的默认服务行为,并且一个UdpAnnouncementEndpoint终结点被添加到了ServiceDiscoveryBehavior的AnnouncementEndpoints集合之中。

1: 
2:   
3:     
4:       
5:         
6:                   binding="ws2007HttpBinding"
7:                   contract="Artech.WcfServices.Service.Interface.ICalculator" />
8:       
9:     
10:     
11:       
12:         
13:           
14:             
15:               
16:             
17:           
18:         
19:       
20:     
21:   
22: 

然后通过如下一段简短的代码对CalculatorService进行寄宿,与之前的不同之处在于输出了一段程序退出的提示性文字。当服务寄宿程序启动后输入任何字符,服务将会被关闭(离线)。

1: using System;
2: using System.ServiceModel;
3: namespace Artech.WcfServices.Service
4: {
5:     class Program
6:     {
7:         static void Main(string[] args)
8:         {
9:             using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
10:             {
11:                 host.Open();
12:                 Console.WriteLine("Enter any key to exit.");
13:                 Console.Read();
14:             }
15:         }
16:     }
17: }

接下来我们需要在客户端通过寄宿AnnouncementService服务来监听CalculatorService服务启动和关闭自动发出的通知。我们先通过如下所示的一段配置为寄宿的AnnouncementService添加一个UdpAnnouncementEndpoint终结点。

1: 
2:     
3:         
4:             
5:                 
6:             
7:         
8:     
9: 

AnnouncementService服务通过如下的代码进行寄宿。由于AnnouncementService被定义成一个单例服务,我们就可以直接针对一个预先创建好的AnnouncementService实例来创建用于服务寄宿的ServiceHost。在服务开启之前,我们注册了AnnouncementService的OnlineAnnouncementReceived和OfflineAnnouncementReceived两个事件,在它接收到目标服务上/下线通知的时候会输出目标服务终结点的地址和契约名称。

1: using System;
2: using System.ServiceModel;
3: using System.ServiceModel.Discovery;
4: namespace Artech.WcfServices.Client
5: {
6:     class Program
7:     {
8:         static void Main(string[] args)
9:         {
10:             AnnouncementService announcementService = new AnnouncementService();
11:             announcementService.OnlineAnnouncementReceived += (sender, e) =>
12:                 {
13:                     string contractTypes = string.Empty;
14:                     Console.WriteLine("Receive Service Online Announcement.");
15:                     Console.WriteLine("\tAddress: {0}", e.EndpointDiscoveryMetadata.Address.Uri);
16:                     Console.WriteLine("\tContract: {0}", e.EndpointDiscoveryMetadata.ContractTypeNames[0]);
17:                 };
18:             announcementService.OfflineAnnouncementReceived += (sender, e) =>
19:             {
20:                 string contractTypes = string.Empty;
21:                 Console.WriteLine("Receive Service Offline Announcement.");
22:                 Console.WriteLine("\tAddress: {0}", e.EndpointDiscoveryMetadata.Address.Uri);
23:                 Console.WriteLine("\tContract: {0}", e.EndpointDiscoveryMetadata.ContractTypeNames[0]);
24:             };
25:             using (ServiceHost host = new ServiceHost(announcementService))
26:             {
27:                 host.Open();
28:                 Console.Read();
29:             }
30:         }
31:     }
32: }

客户端和服务端所有的配置和编码工作完成之后,先启动客户端开启通知监听服务。然后开启服务端启动服务CalculatorService,最后输入任意键(不要直接关闭控制台窗口)退出服务端程序。此时你会发现客户端的控制台上具有如下的输出。这段文字的第一部分代表CalculatorService启动的时候(ServiceHost的Open方法被执行之后)发出的上线通知,后一部分代表服务关闭(ServiceHost的Dispose方法执行之后)发出的离线通知。

1: Receive Service Online Announcement.
2:         Address: http://127.0.0.1:3721/calculatorservice
3:         Contract: http://www.artech.com/:ICalculator
4: Receive Service Offline Announcement.
5:         Address: http://127.0.0.1:3721/calculatorservice
6:         Contract: http://www.artech.com/:ICalculator

转载地址:http://bipol.baihongyu.com/

你可能感兴趣的文章
C#实现GDI+基本图的缩放、拖拽、移动
查看>>
github-ssh
查看>>
FiddlerScript学习一:改动Request或Response
查看>>
linux下dd命令详解【转】
查看>>
JS及JQuery对Html内容编码,Html转义
查看>>
在java中如何在非servlet的普通类中获取request、response、session
查看>>
Linux Rsync
查看>>
Redis实现消息队列
查看>>
2k8 32bit下载
查看>>
密码需要带特殊字符
查看>>
个人收集的java精品网站
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
如何在基于Bytom开发过程中集成IPFS
查看>>
后台管理,给列表页新增查询功能,所遇到的问题及感想
查看>>
GraalVM 社区版 1.0 RC15 发布,新一代高性能跨语言虚拟机
查看>>
阿里架构师眼里JVM可以说的那些事
查看>>
C#实现局部峰值查找,功能对应Matlab中的findpeaks.m
查看>>
响应式编程
查看>>
The Road to learn React书籍学习笔记(第一章)
查看>>
WPF 自定义控件的坑(蠢的:自定义控件内容不显示)
查看>>