Discovery Find 和 FindCriteria

发现查找操作是发现功能中的主要操作之一,它由客户端启动,用于发现一个或多个服务。执行查找时将通过网络发送一条 WS-Discovery Probe 消息。与指定条件匹配的服务通过 WS-Discovery ProbeMatch 消息进行答复。有关发现消息的更多信息,请参见 WS-Discovery specification(WS-Discovery 规范)。

DiscoveryClient

DiscoveryClient 类提供执行查找操作的机制,并简化了发现客户端操作的执行过程。该类包含 Find 方法和 FindAsync 方法,前者用于执行(阻塞的)同步查找,后者用于启动非阻塞的异步查找。这两个方法均采用 FindCriteria 参数,并通过 FindResponse 对象将结果提供给用户。

FindCriteria

FindCriteria 包含若干属性,可将这些属性划分为搜索条件(指定要查找的服务)和查找终止条件(搜索应持续的时长)。FindCriteria 可包含多个搜索条件。默认情况下,服务必须与所有组件匹配,否则不会将其自身视为匹配的服务。如果要查找仅与某些条件匹配的服务,您可以对服务实现自定义查找逻辑,也可以使用多个查询。

搜索条件包括:

  • ContractTypeNames - 可选项。要搜索的服务的协定名称以及搜索服务时通常采用的条件。如果指定了多个协定名称,则只有与所有协定均匹配的服务终结点才会进行答复。请注意,在 WCF 中,一个终结点只能支持一个协定。

  • Scopes - 可选项。范围表示对各服务终结点进行分类所使用的绝对 URI。如果多个终结点公开同一协定,并且您希望采用某种方法来搜索终结点的子集,则您可能希望使用此搜索条件。如果指定了多个范围,则只有与所有范围匹配的服务终结点才会进行答复。

  • ScopeMatchBy - 指定当对 Probe 消息中的范围和终结点中的范围进行匹配时采用的匹配算法。支持以下五种范围匹配规则:

    • ScopeMatchByExact 执行区分大小写的基本字符串比较。

    • ScopeMatchByPrefix 按以“/”分隔的段进行匹配。搜索 http://contoso/building1 与范围为 http://contoso/building/floor1 的服务相匹配。请注意,该搜索与 http://contoso/building100 不匹配,因为最后两个段不匹配。

    • ScopeMatchByLdap 按使用 LDAP URL 的段来匹配范围。

    • ScopeMatchByUuid 通过使用 UUID 字符串来完全匹配范围。

    • ScopeMatchByNone 仅匹配那些未指定范围的服务。

    如果未指定范围匹配规则,则使用 ScopeMatchByPrefix

终止条件包括:

  1. Duration - 等待网络上的服务所发送答复的最长时间。默认持续时间为 20 秒。

  2. MaxResults - 等待的答复的最大数目。如果在经过 Duration 之前收到了 MaxResults 答复,查找操作将结束。

FindResponse

FindResponse 具有一个 Endpoints 集合属性,该集合属性包含网络上的匹配服务发送的所有答复。如果没有任何服务进行答复,该集合将为空。如果一个或多个服务进行了答复,则各答复将分别存储在一个 EndpointDiscoveryMetadata 对象中,该对象包含有关服务的地址、协定以及某些其他信息。

下面的示例演示如何在代码中执行查找操作。

// Create DiscoveryClient
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

// Create FindCriteria
FindCriteria findCriteria = new FindCriteria(typeof(IPrinterService));
findCriteria.Scopes.Add(new Uri("https://www.contoso.com/building1/floor1"));
findCriteria.Duration = TimeSpan.FromSeconds(10); 

// Find ICalculatorService endpoints            
FindResponse findResponse = discoveryClient.Find(findCriteria);

Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count)

另请参见

任务

通过范围进行发现的示例
异步查找示例
基本示例

概念

WCF Discovery 概述
使用 Discovery 客户端通道