WCF4.0新特性体验(11):服务发现WS-Discovery之设定FindCriteria

Posted on 2010-04-11 18:42 Frank Xu Lei 阅读(863) 评论(15)   编辑 收藏 所属分类: SOA and EAI, WCF4.0新特性体验

WCF4.0新特性体验(10):服务发现WS-Discovery之简单的Ad hoc Service Discovery 之后,今天我们将学习WCF4.0服务发现WS-Discovery的第二部分:WCF4.0新特性体验(11):服务发现WS-Discovery之设定FindCriteria。

     本节里我会介系统介绍服务发现提供了设置客户端查找条件的机制,也就是DiscoveryClient如何在搜索服务的时候使用特定的条件来查找特定的服务。开始部分我会补充介绍一下WCF动态服务发现的终结点内容。然后是设定查找范围(Scope)FindCriteria的概念,以及实现过程。

【1】Find 与FindCriteria:

   Find是客户端查找一个或多个服务的重要动作。客户端在查找服务的过程中,需要发送一个Probe探测消息,匹配服务的消息会回发一个ProbeMatch匹配应答消息给客户端。

【2】DiscoveryClient:

 DiscoveryClient类定义了一些方法,它实现了动态查询服务的机制。利用这个类型,我们可以很方便地在客户端实现服务的查找工作。它定义了一个Find方法,这个方法包含一个异步的实现FindAsync 。两个方法都接受一个FindCriteria 参数,然后返回一个FindResponse 的查询结果。如果查询到匹配的服务,这里会包含一些必要的服务信息,比如地址Address。

【3】服务发现终结点介绍:

  在WCF4.0新特性体验(3):标准终结点(Standard Endpoints)一节里我们已经介绍过了WCF4.0提供的服务终结点。WCF4.0提供了8个已经定义好的标准终结点,其中与WS-Discovery服务动态发现相关终结点包含4个:announcementEndpoint、 discoveryEndpoint、udpAnnouncementEndpoint、udpDiscoveryEndpoint。各个终结点的作用如下表:

名称描述
mexEndpoint预定义了一个元数据交换节点,默认使用IMetadataExchange 契约和mexHttpBinding 绑定,address为空。
announcementEndpoint为discovery的声明功能预定义的标准终结点,在使用此终结点用户需要额外配置address和binding。
discoveryEndpoint为discovery 操作,预定义的一个标准终结点,在使用此终结点用户需要额外配置address和binding。
udpAnnouncementEndpoint为使用UDP binding和WS-Discovery 协议规定的多播地址的discovery的声明功能提供的预定义的终结点。它继承自announcementEndpoint。
udpDiscoveryEndpoint为discovery 操作提供的预定义的终结点。比如通过UDP binding和WS-Discovery 协议规定的多播地址的发现(find) 和解析(resolve。它继承自DiscoveryEndpoint。
workflowControlEndpoint定义了一个控制workflow 实例执行状态的标准终结点(create、run、suspend、terminate等等)。
webHttpEndpoint定义了一个配置了WebHttpBinding 和WebHttpBehavior的标准终结点。它继承自WebServiceEndpoint。在编写REST service使用。
webScriptEndpoint定义了一个配置了WebHttpBinding 和WebScriptEnablingBehavior的标准终结点。它用于编写ASP.NET AJAX程序。

【4】FindCriteria:

FindCriteria 定义了几个属性,他们可以设置查询条件,我们可以来指定查询条件。此外这个还可以指定查询条件的持续时间。如果我们要查找符合其中一些条件而不是全部条件的服务,就必须自定义Find逻辑,或者使用多个查询来实现。

查询条件包含:

  • ContractTypeNames :选择性的,目标服务使用的契约名称。如果只有一个契约符合条件,则匹配服务的所有契约都会应答。因为一个WCF服务可以定义多个终结点,每个终结点只能包含一个契约Contract。
  • Scopes :选择性的,Scopes是服务终结点使用的绝对的URI。这个条件在查询多个终结点使用了同一个契约的时候,非常有用。我们可以查询匹配特定URI的终结点。如果我们指定多个Scope,则只有满足所有Scope的终结点才会响应查询。
  • ScopeMatchBy:在Probe探测消息匹配Scope的时候指定特定的匹配规则,支持一下五种规则:
    • ScopeMatchByExact:会做精确的大小写匹配。
    • ScopeMatchByPrefix:匹配前缀,只要URI前缀部分相同即可匹配。
    • ScopeMatchByLdap:使用LDAP URL来匹配Scope。
    • ScopeMatchByUuid:使用UUID 字符串来匹配Scope。
    • ScopeMatchByNone:匹配服务的时候不需要Scope.
    默认情况下,如果不指定ScopeMatchBy,就会使用ScopeMatchByPrefix规则。

结束查询包含:

  1. Duration:等待服务响应的最长等待时间。默认是20秒。
  2. MaxResults:等待响应消息的最大数目,如果在Duration 持续时间内返回了期望的消息数目,则查询操作终止

【5】FindResponse:

 FindResponse包含一个EndPoint集合属性,这个属性里包含了所有回发应答ProbeMatch探测消息的服务地址。如果没有匹配的地址,集合就会为空。如果有匹配的服务,那么每个应答消息都会存储在一个EndpointDiscoveryMetadata对象里,这个对象里包含了服务的Address、Contract以及其它的一些信息。

【6】示例代码分析:

  第一节代码里,我们给出了简单的基于Ad-Hoc模式的服务发现例子,使用的是基于Contract作为查询条件。另外我们也可以增加其它的限制条件,必须Scope来提高匹配精确度。

  首先,这里如果使用Scope,服务在发布以前就必须把每个终结点EndPoint和特定的Scope关联。WCF4.0里,我们可以在<endpointDiscovery> behavior 里进行设置,当然也可以通过代码实现。下面我们就来详细讲解一下详细的实现过程。

【6.1】服务端:

  我们这里服务端端对于其中的一个终结点,配置了Scope,其余终结点没有指定。具体配置信息如下:

   < system.serviceModel >
    
< services >
      
< service name = " WCFService.WCFService " >
        
< endpoint address = " http://localhost:8000/ws "     binding = " wsHttpBinding "  contract = " WCFService.IWCFService "  behaviorConfiguration = " epBehavior "   />
        
< endpoint address = " http://localhost:8000/basic "  binding = " basicHttpBinding "  contract = " WCFService.IWCFService "   />
        
< endpoint address = " net.tcp://localhost:8001/tcp "  binding = " netTcpBinding "  contract = " WCFService.IWCFService "   />
        
<!--  add a standard UDP discovery endpoint -->
        
< endpoint name = " udpDiscovery "  kind = " udpDiscoveryEndpoint " />
      
</ service >
    
</ services >
    
< behaviors >
      
< serviceBehaviors >
        
< behavior >
          
< serviceDiscovery />
          
<!--  enable service discovery behavior  -->
        
</ behavior >
      
</ serviceBehaviors >
      
< endpointBehaviors >
        
< behavior name = " epBehavior " >
          
< endpointDiscovery >
            
<!--  scopes associated with  this  endpoint behavior  -->
            
< scopes >
              
< add scope = " http://localhost:8000/ " />
            
</ scopes >
          
</ endpointDiscovery >
        
</ behavior >
      
</ endpointBehaviors >
    
</ behaviors >
  
</ system.serviceModel >

 

【6.2】客户端:

  客户端可以在运行时,动态查询匹配的终结点。我们可以增加Scope条件到查询FindCriteria的属性里。下面例子展示了如何使用ScopeMatchByPrefix来查询服务终结点。我们先动态查询所有可用的终结点信息,然后打印出来,最后使用Scope匹配一个特定的终结点:代码如下:

//  创建DiscoveryClient
            DiscoveryClient discoveryClient  =   new  DiscoveryClient( " udpDiscoveryEndpoint " );
            
//  Find ICalculatorService endpoints in the specified scope
            
//  特定范围内查找IWCFService终结点
            FindCriteria findCriteria  =   new  FindCriteria();
            
// findCriteria.Scopes.Add(scope);
            FindResponse findResponse  =  discoveryClient.Find(findCriteria);
            
// 打印所有终结点信息
            Console.WriteLine( " All Endpoints: " );
            Console.ForegroundColor 
=  ConsoleColor.Yellow;
            
foreach  (EndpointDiscoveryMetadata edm  in  findResponse.Endpoints)
            {
                Console.WriteLine(
" [Address]: {0},[Contract]: {1} " ,
                edm.Address, edm.ContractTypeNames[
0 ].Name);
            }
            
// 定义Scope
            Uri scope  =   new  Uri( " http://localhost:8000/ " );
            findCriteria.Scopes.Add(scope);
            findResponse 
=  discoveryClient.Find(findCriteria);
            
// 打印所有终结点信息
            Console.WriteLine( " Special Endpoints: " );
            Console.ForegroundColor 
=  ConsoleColor.Red;
            
foreach  (EndpointDiscoveryMetadata edm  in  findResponse.Endpoints)
            {
                Console.WriteLine(
" [Address]: {0},[Contract]: {1} " ,
                edm.Address, edm.ContractTypeNames[
0 ].Name);
            }

 

【6.3】运行结果:

     启动Host,运行客户端结果显示如下:

【7】总结:

  使用Scope,我们可以更容易地查找特定的服务终结点EndPoint。尤其是当一个服务实现多个终结点的时候。另外服务发现也允许扩展,我们可以给服务在一个EndPoint上添加特定的元数据。这些MetaData信息业会在应答消息里返回给客户端。

     下面给出本文的例子代码,供大家参考:

/Files/frank_xl/12.WCFDiscovery_FindCriteria.rar 

参考文章:

1.http://msdn.microsoft.com/en-us/magazine/ee335779.aspx

2.http://www.codeproject.com/KB/WCF/ws-discovery.aspx

3.http://weblogs.asp.net/gsusx/archive/2009/02/13/using-ws-discovery-in-wcf-4-0.aspx

4.http://msdn.microsoft.com/en-us/library/dd456790(VS.100).aspx

5.http://msdn.microsoft.com/en-us/library/dd456790(VS.100).aspx


 

老徐的博客
【作      者】:Frank Xu Lei
【地      址】:http://www.cnblogs.com/frank_xl/
【中文论坛】:微软WCF中文技术论坛
【英文论坛】:微软WCF英文技术论坛

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值