今天我们将学习WCF4.0新特性体验系列的一个重要特性:服务发现WS-Discovery。这一部分内容较多,大概涉及到以下几个知识点:(1)Ad hoc Service Discovery。(2 )设定查找范围(Scope)。(3) 服务公告Service Announcement。(4)托管服务(Managed Service) Discovery。这几个主要的内容,我大概分几个文章详细介绍一下。并给出实现过程和示例代码。当然中间会贯穿介绍相关的文档规范资料和技术原理。 我们在接下来的文章里就会对这一 WCF 特性做一个系统完整的介绍。第一节就先学习简单的Ad hoc Service Discovery。
     在谈到这个特性的时候,可能许多人会兴奋不已,因为之前的WCF开发过程都是按照流程一步一步完成的,开发部署服务,客户端添加服务引用,最后使用服务终结点来调用服务。但是现在这个服务发现功能支持你可以在动态运行时发现并调用你需要的服务。
【1】基本概念:
    服务发现是WCF4.0里的一个重要特性,这是WCF4.0新特性里唯一一个因WS规范而生的,就是为了支持WS-Discovery 协议。我们知道在面向服务系统里,有时候,服务的地址是动态生成的,并且可能一直在变化。例如,有时候,不同的服务设备会频繁地接入或者离开整个系统。为了适应这种变化,客户端必须具备可以动态查×××的能力。也就服务发现:WS-Discovery 。
     WS-Discovery是一个基于SOAP协议的动态服务发现OASIS标准,它可以在运行时发现服务终结点。客户端可以根据一定的条件来探测特定的服务目标,最后根据特定的匹配条件返回最佳的服务终结点地址。
【2】文档规范:
  这里为了说明服务发现,我们必须有必要了解一下一个重要的行业规范。首先,服务发现并不是什么新奇的概念,WCF一直支持WS-*规范。这在之前的一些文章里经常被提到,尤其是WCF跨平台特性的时候。当然WCF服务发现功能也不是无中生有,它也是根据WS-Discovery 规范开发而来。
【2.1】WS-Discovery 诞生:
  最早的WS-发现协议是2005年4月版本,后来在2009年7月重新推出1.1版本。同样,WCF-Discovery WCF-Discovery 支持两种版本的WS-Discovery 协议:
【2.2】OASIS标准:
  在WS-*规范中,WS-Discovery是在2008年才加入了OASIS标准(OASIS(结构化信息标准促进组织,Organization for the Advancement of Structured Information Standards)是一个推进 电子商务标准的发展、融合与采纳的非盈利性国际化组织。)。WS-Discovery被定义为Web Service Dynamic Discovery,其目的是为定位动态服务发现协议,主要应用在为客户端动态搜索一个或多个目标服务。
【2.3】官方资料:
     这里比较重要的参考资料列举一下,首先就是WS-Discovery 1.1,这个现在是OASIS标准。是服务发现的本质原理文档。另外一个重要的资料当然属于MSDN文档,对于想了解WCF 动态服务发现机制的开发人员来说至关重要。还有就是如果你想知道WCF开发团队如何设计和实现WCF-Discovery ,你也可以看看他们的博客。
  以上就是主要的资料信息。不过目前都是英文文档。
【3】服务发现模式:
      服务发现也需要依据一定的规则,在WS- Discovery里定义了两种操作模式:Ad hoc和Managed模式。前者也叫自动查找模式,后者也被叫做托管模式。
  •     Ad hoc模式:
  这种方式,就像自己找女朋友。在春天又一次到来的时候,你忽然有了某个冲动,要为人类的繁衍做出点贡献,于是选择了一种方式,自己去寻找异性。有一天走在大街上,面对串流不息的人群,你大声疾呼:美女!(多播,Probe探测消息)
WCF4.0新特性体验(10):服务发现WS-Discovery之简单的Ad hoc Service Discovery_Ad hoc Service Disco
(Ad hoc模式)
    这时,路人纷纷回头,此时一个50年前的美女(ProbeMatch),走了过来(单播),两人一见钟情(建立连接),相见恨晚,有情人终成眷属。
  • Managed模式:
  此模式与前者不同的是,为了实现大范围,高效率查找目标服务,就必须借助这种模式,简单理解就好比婚介公司。
最近网上热炒的越南新娘就是一个问题。如果我们想找到一个理想的物美价廉的老婆,那么越南新娘或许对于大多数单身中国男性来说是一个不错的选择,单身碍于跨国等重重困难,婚介公司(Discovery Proxy )到是一个快捷的途径。姑娘在婚介公司注册,我等杯具男发送Probe探测消息给婚介公司(Discovery Proxy )。匹配到合适的姑娘,回复消息,建立连接。
WCF4.0新特性体验(10):服务发现WS-Discovery之简单的Ad hoc Service Discovery_体验_02
(Manage模式)
  当然这也只是一个比如,方便大家理解WS服务发现机制。
【3.1】Ad hoc模式:
  在此模式下,客户端会通过UDP以多播的形式发送一个Probe(探测)消息,如果服务匹配该探测信息,则以单播方式直接响应客户端一个ProbeMatch(应答)消息
     为了减少客户端多播带来的性能问题,WCF允许服务加入、离开网络的时候发送一个多播消息,任何关注此服务的客户端都可以侦听这个消息。由于Ad hoc 基于UDP协议,所以只能适用于本地子网。
【3.2】Managed模式:
  当我们需要跨多个网络发现服务的时候,就必须使用Managed发现模式。这里要借助的一个机制就是服务发现代理(Discovery Proxy )。服务代理管理服务的信息,并且可以跨越服务边界。服务代理的工作就是保存服务的终结点信息、处理客户端的查找请求。Managed发现模式的坏处就是实现复杂,不够灵活。好处就是可以显著降低ad hoc模式多播查找带来的网络负载问题,而且大大提高查找的效率。
【4】服务发现实例代码分析:
  WCF 4.0为了支持WS-Discovery规范,提供了丰富的类定义。这些类型处理System.ServiceModel.Discovery命名空间下。我们这里介绍一下简单的Ad hoc服务发现的实现过程。
【4.1】服务端:
  这里WCF服务通过使用标准的服务发现终结点udpDiscoveryEndpoint和服务行为<serviceDiscovery> behavior 就可以了。我们可以通过配置文件或者代码带来实现,配置文件的例子如下:
<configuration>
        <system.serviceModel>
            <services>
                <service name="WCFService">
                    <endpoint binding="wsHttpBinding" contract="IWCFService" />
                    <!-- add a standard UDP discovery endpoint-->
                    <endpoint name="udpDiscovery" kind="udpDiscoveryEndpoint"/>
                </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior>
                        <serviceDiscovery/> <!-- enable service discovery behavior -->
                    </behavior>
                </serviceBehaviors>
            </behaviors>
        </system.serviceModel>
</configuration>
【4.2】客户端:
   客户端就可以通过发送Probe和Resolve消息来发现服务。DiscoveryClient 类中。它接受一个发现终结点对象,然后通过调用Find()方法,该方法接受一个FindCriteria来指定搜索条件。具体代码如下:
// 创建DiscoveryClient
                        DiscoveryClient discoveryClient = new DiscoveryClient("udpDiscoveryEndpoint");

                        // 特定范围内查找IWCFService终结点
                        FindCriteria findCriteria = new FindCriteria(typeof(IWCFService));
                        FindResponse findResponse = discoveryClient.Find(findCriteria);

                        //选择第一个终结点
                        EndpointAddress address = findResponse.Endpoints[0].Address;

                        // 创建服务代理客户端实例
                        IWCFService client = ChannelFactory<IWCFService>.CreateChannel(new WSHttpBinding(), address);    

                        Console.WriteLine("Invoking WCFService at {0}", address);
                        // 调用SayHello服务操作.
                        string result = client.SayHello("Frank Xu Lei");

                        Console.WriteLine("Press any key to continue");
                        Console.Read();
【4.3】运行结果:
运行结果如下:
WCF4.0新特性体验(10):服务发现WS-Discovery之简单的Ad hoc Service Discovery_Ad hoc Service Disco_03
【5】总结:
        这里就是一个简单的WCF Ad hoc服务发现模式的一个实现过程。请继续关注后续文章。
        本文的例子代码供大家参考。/Files/frank_xl/11.WCFDiscovery_AdHoc.zip
参考文章: