閱讀186 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[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

作者:蔣金楠 
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-26 14:34:43

  上一篇:go  【天池直播】同濟教授分享應用算法優化航空運營(第一場運籌學領域直播)
  下一篇:go  [WCF-Discovery]如何利用”發現代理”實現可用服務的實時維護?