[WCF-Discovery]讓服務自動發送上/下線通知[實例篇]
在《原理篇》我們對客戶端如何監聽通知,以及服務在上下線時如何發送通知從原理上進行了深入地剖析。我們現在通過一個簡單的實例演示如何通過ServiceDiscoveryBehavior服務行為為寄宿的服務添加一個實現上/下線通知的AnnouncementEndpoint終結點,以及客戶端如何通過對AnnouncementService服務的寄宿實現對通知的監聽和接收。[源代碼從這裏下載]
我們采用如右圖所示的解決方案結構,其中Service.Interface、Service(控製台程序)和Client(控製台程序),用於用於定義服務契約、服務類型(服務寄宿)和客戶端監聽程序。並且直接使用我們熟悉的CalculatorService。現在我們為該服務的寄宿定義如下一段配置。我們定義了一個包含ServiceDiscoveryBehavior行為的默認服務行為,並且一個UdpAnnouncementEndpoint終結點被添加到了ServiceDiscoveryBehavior的AnnouncementEndpoints集合之中。
1: <configuration>
2: <system.serviceModel>
3: <services>
4: <service name="Artech.WcfServices.Service.CalculatorService">
5: <endpoint address="https://127.0.0.1:3721/calculatorservice"
6: binding="ws2007HttpBinding"
7: contract="Artech.WcfServices.Service.Interface.ICalculator" />
8: </service>
9: </services>
10: <behaviors>
11: <serviceBehaviors>
12: <behavior>
13: <serviceDiscovery>
14: <announcementEndpoints>
15: <endpoint kind="udpAnnouncementEndpoint" />
16: </announcementEndpoints>
17: </serviceDiscovery>
18: </behavior>
19: </serviceBehaviors>
20: </behaviors>
21: </system.serviceModel>
22: </configuration>
然後通過如下一段簡短的代碼對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添加一個終結點。
1: <configuration>
2: <system.serviceModel>
3: <services>
4: <service name="System.ServiceModel.Discovery.AnnouncementService">
5: <endpoint kind="udpAnnouncementEndpoint" />
6: </service>
7: </services>
8: </system.serviceModel>
9: </configuration>
AnnouncementService服務通過如下的代碼進行寄宿。由於AnnouncementService被定義成一個單例服務,我們就可以直接針對一個預先創建好的AnnouncementService實例來創建用於服務寄宿的ServiceHost。,在它接收到目標服務上/下線通知的時候會輸出目標服務終結點的地址和契約名稱。
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: https://127.0.0.1:3721/calculatorservice
3: Contract: https://www.artech.com/:ICalculator
4: Receive Service Offline Announcement.
5: Address: https://127.0.0.1:3721/calculatorservice
6: Contract: https://www.artech.com/:ICalculator
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-26 14:34:43