Discovery Find 和 FindCriteria

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

DiscoveryClient

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

FindCriteria

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

搜索条件包括:

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

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

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

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

终止条件包括:

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

  2. 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)

另请参阅