发现查找操作由客户端启动,以发现一个或多个服务,并且是发现过程中的主要操作之一。 执行查找时将通过网络发送一条 WS-Discovery Probe 消息。 符合指定条件的服务将通过 WS-Discovery ProbeMatch 消息进行回复。 有关发现消息的详细信息,请参阅 WS-Discovery 规范。
DiscoveryClient
该 DiscoveryClient 类提供执行查找作的机制,并使执行发现客户端作变得简单。 它包含一个 Find 方法,该方法执行(阻止)同步查找,以及一个 FindAsync 启动非阻塞异步查找的方法。 这两种方法都采用参数 FindCriteria ,并通过对象向用户 FindResponse 提供结果。
FindCriteria
FindCriteria 具有多个属性,这些属性可以分组到搜索条件中,这些条件指定要查找的服务,并查找终止条件(搜索应持续多长时间)。 A FindCriteria 可以包含多个搜索条件。 默认情况下,该服务必须匹配所有组件,否则它不会将其视为匹配服务。 如果想要查找仅符合某些条件的服务,可以在服务上实现自定义查找逻辑,也可以使用多个查询。
搜索条件包括:
ContractTypeNameElement -自选。 要搜索的服务的协定名称,以及搜索服务时通常使用的条件。 如果指定了多个协定名称,则只有匹配所有协定的服务终结点会响应。 请注意,在 WCF 中,终结点只能支持一个协定。
ScopeElement -自选。 范围是用于对单个服务终结点进行分类的绝对 URI。 如果多个终结点公开同一协定,并且您希望采用某种方法来搜索终结点的子集,则您可能希望使用此搜索条件。 如果指定了多个范围,则只有与所有范围匹配的服务终结点答复。
ScopeMatchBy - 指定在将探测消息中的作用域与终结点匹配时要使用的匹配算法。 有五个受支持的范围匹配规则:
FindCriteria.ScopeMatchByExact 执行基本区分大小写的字符串比较。
FindCriteria.ScopeMatchByPrefix 使用按“/”分隔的段进行匹配。 搜索
http://contoso/building1会匹配范围为http://contoso/building/floor1的服务。 请注意,它不匹配http://contoso/building100,因为最后两个段不匹配。FindCriteria.ScopeMatchByLdap 使用 LDAP URL 按段匹配范围。
FindCriteria.ScopeMatchByUuid 通过使用 UUID 字符串来完全匹配范围。
FindCriteria.ScopeMatchByNone 仅与未指定作用域的服务匹配。
如果未指定范围匹配规则, ScopeMatchByPrefix 则使用。
终止条件包括:
Duration - 等待网络上服务答复的最长时间。 默认持续时间为 20 秒。
MaxResults - 要等待的最大答复数。 如果在经过 MaxResults 之前收到了 Duration 答复,查找操作将结束。
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("http://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)