[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="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

作者:蒋金楠 
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
133 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
253 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
237 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
959 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1176 0
WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。
1106 0
|
网络架构
(纯代码)快速创建wcf rest 服务
因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBinding 2.
1073 0
|
Web App开发 .NET 测试技术
.net WCF简单实例
  最近看到网上招聘有许多都需要WCF技术的人员,我之前一直没接触过这个东西,以后工作中难免会遇到,所谓笨鸟先飞,于是我就一探究竟,便有了这边文章。由于是初学WCF没有深入研究其原理,只是写了一个demo留着以后,如果哪里写的不对希望大佬们能指出批评。
1125 0