您的位置:首页 > 其它

[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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: