WCF WS-Discovery应用技巧分享

开发 开发工具
WCF WS-Discovery的目的就是为了定位服务定义Discovery协议,来为客户端的搜索提供一定的帮助,其分为两种模式,分别为:ad hoc和managed模式。

WCF是一款使用托管代码建立的应用程序统一框架。它在实际应用中可以帮助开发人员轻松的实现一个安全性高,可依赖性的开发解决方案,轻松帮助用户解决各种问题。在这里我们会为大家详细介绍一下WCF WS-Discovery的相关应用技巧。#t#

在WS-*标准和规范中,WCF WS-Discovery是在2008年才加入了OASIS标准。WS-Discovery在标准被定义为Web Service Dynamic Discovery,其目的是为定位服务定义Discovery协议,主要应用在为客户端动态搜索一个或多个目标服务。OASIS为WS- Discovery提供了两种操作模式:ad hoc和managed模式。

ad hoc模式根据类型在托管目标服务的范围内查找目标服务。客户端会以多播的形式发送一个Probe(探测)消息,如果服务匹配该信息,则以单播方式直接将响应发送到客户端。为了能够根据名称定位目标服务,客户端会以相同的多播组发送一个Resolve(解析)消息,同样的,匹配该消息的服务会直接以单播方式响应客户端。

如果Endpoint的数量扩大了,且超出了ad hoc网络的范围之外,而且在网络中可以使用Discovery Proxy(发现代理),则应该采用Managed操作模式,以禁止多播的行为。在Managed模式下,目标服务只需要以单播的形式发布一个 announcement(通告)消息到Discovery Proxy,同时,客户端也会以单播形式发送Probe和Resolve消息到Discovery Proxy。这种模式并非直接采用单播方式,而是会实时对Discovery Proxy进行监听,然后根据情况切换操作模式,从而降低多播给网络传输带来的影响。当Discovery Proxy检测到在ad hoc网络中有多播方式发送的Probe和Resolve消息时,它就会发布announcement通知自身。客户端一旦监听到Discovery Proxy上的announcement消息,就切换为Managed模式,直接以单播方式将probe和resolve消息发送给Discovery Proxy。如果Discovery Proxy没有响应,客户端又会切换为ad hoc操作模式。Managed模式的消息交换流程如下所示:

 

WCF 4.0实现了OASIS的WCF WS-Discovery标准,相关的类定义在System.ServiceModel.Discovery命名空间中。这是一个单独的程序集,所以需要添加对它的引用。

 

WCF Discoverty支持ad hoc和Managed模式,其中实现Managed模式需要实现Discovery Proxy。

在WCF 4.0中,新增了ServiceDiscoveryBehavior行为类,可以控制服务终结点的可发现能力。它能够让服务的所有终结点都能被发现,相反,如果使用EndpointDiscoveryBehavior则只能使特定的终结点能够被发现。除了需要添加发现行为,我们还需要添加发现终结点,用来指定监听以及发送discovery消息。WCF中标准的发现终结点类是UdpDiscoveryEndpoint,它基于UDP的多播绑定,是WCF 预先配置好的发现终结点。该终结点继承自DiscoveryEndpoint类。在托管服务的时候,我们可以向ServiceHost中添加 ServiceDiscoveryBehavior和EndpointDiscoveryBehavior,如下所示:

  1. class CalculatorServiceHost {  
  2. public static void Main() {  
  3. Uri baseAddress = new Uri("http://localhost:8000/" + 
    Guid.NewGuid().ToString());   
  4. using (ServiceHost serviceHost = new ServiceHost(typeof
    (CalculatorService), baseAddress)) {  
  5. serviceHost.AddServiceEndpoint(typeof(ICalculatorService), 
    new WSHttpBinding(), String.Empty);  
  6. // Make the service discoverable over UDP multicast   
  7. serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());   
  8. serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());  
  9. serviceHost.Open();  
  10. Console.WriteLine("Calculator Service started at {0}", baseAddress);  
  11. Console.WriteLine();  
  12. Console.WriteLine("Press <ENTER> to terminate the service.");  
  13. Console.WriteLine();  
  14. Console.ReadLine();  
  15. }  
  16. }  

 

在对服务宿主进行如下设置之后,客户端就可以通过发送Probe和Resolve消息来发现服务。WCF将这些逻辑封装在了DiscoveryClient 类中。它接受一个发现终结点对象,然后通过调用它的Find()方法(该方法接受一个FindCriteria实例,用来指定搜索标准,在下面的代码片断中指定搜索标准为按照目标服务的类型),返回FindResponse对象。该对象会包含一个 Collection<EndpointDiscoveryMetadata>类型的属性Endpoints:

  1. // Create DiscoveryClient  
  2. DiscoveryClient discoveryClient = new DiscoveryClient
    (new UdpDiscoveryEndpoint());  
  3. Console.WriteLine("Finding ICalculatorService endpoints...");  
  4. Console.WriteLine();  
  5. // Find ICalculatorService endpoints   
  6. FindResponse findResponse = discoveryClient.Find
    (new FindCriteria(typeof(ICalculatorService)));  
  7. Console.WriteLine("Found {0} ICalculatorService endpoint(s).", 
    findResponse.Endpoints.Count);  
  8. Console.WriteLine();  
  9. if (findResponse.Endpoints.Count > 0) {  
  10. return findResponse.Endpoints[0].Address;  
  11. } else {  
  12. return null;  

 

通过WCF WS-Discovery,我们不需要知道WCF服务的终结点,只要存在目标服务,我们就能够动态查找到该服务。即使服务的Url发生改变,我们也不需要修改任何代码和配置文件,客户端仍然能够正常发现目标服务。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-03-01 13:06:49

WCF继承

2010-02-25 15:25:19

WCF通道

2010-02-22 17:21:02

WCF消息交换

2010-02-25 10:52:29

WCF响应服务

2010-03-01 09:48:23

WCF会话服务

2010-02-23 13:03:34

WCF序列化

2010-02-26 10:46:12

WCF行为扩展

2010-03-02 10:50:57

WCF元数据交换

2010-02-25 18:04:02

WCF IIS宿主

2010-03-01 15:40:04

WCF实例停用

2010-03-01 17:52:03

WCF选择绑定

2010-02-24 17:07:26

WCF序列化引擎

2010-02-22 17:58:06

WCF异步上传

2010-02-22 11:25:50

WCF DateSet

2010-02-24 11:22:04

WCF方法重载

2009-12-22 19:00:08

WCF回调

2010-02-26 14:12:27

WCF元数据

2010-02-23 16:46:47

WCF并发能力

2010-02-22 16:26:47

WCF传输数据

2010-02-22 16:19:25

WCF自托管
点赞
收藏

51CTO技术栈公众号