WCF-Discovery AnnouncementEnpoint UdpAnnouncementEnpoint示例

  在《WCF-Discovery AnnouncementEnpoint UdpAnnouncementEnpoint介绍》 我们对客户端如何监听通知,以及服务在上下线时如何发送通知从原理上进行了深入地剖析。我们现在通过一个简单的实例演示如何通过 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="http://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添加一个UdpAnnouncementEndpoint终结点。

   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。在服务开启之前,我们注册了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

作者:Artech
出处:http://artech.cnblogs.com/

加支付宝好友偷能量挖...


评论(0)网络
阅读(93)喜欢(0)Asp.Net/C#/WCF