Discovery Find 和 FindCriteria

发现查找操作由客户端启动,以发现一个或多个服务,并且是发现过程中的主要操作之一。 执行查找时将通过网络发送一条 WS-Discovery Probe 消息。 符合指定条件的服务将通过 WS-Discovery ProbeMatch 消息进行回复。 有关发现消息的详细信息,请参阅 WS-Discovery 规范

DiscoveryClient

DiscoveryClient 类提供执行查找作的机制,并使执行发现客户端作变得简单。 它包含一个 Find 方法,该方法执行(阻止)同步查找,以及一个 FindAsync 启动非阻塞异步查找的方法。 这两种方法都采用参数 FindCriteria ,并通过对象向用户 FindResponse 提供结果。

FindCriteria

FindCriteria 具有多个属性,这些属性可以分组到搜索条件中,这些条件指定要查找的服务,并查找终止条件(搜索应持续多长时间)。 A FindCriteria 可以包含多个搜索条件。 默认情况下,该服务必须匹配所有组件,否则它不会将其视为匹配服务。 如果想要查找仅符合某些条件的服务,可以在服务上实现自定义查找逻辑,也可以使用多个查询。

搜索条件包括:

  • ContractTypeNameElement -自选。 要搜索的服务的协定名称,以及搜索服务时通常使用的条件。 如果指定了多个协定名称,则只有匹配所有协定的服务终结点会响应。 请注意,在 WCF 中,终结点只能支持一个协定。

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

  • ScopeMatchBy - 指定在将探测消息中的作用域与终结点匹配时要使用的匹配算法。 有五个受支持的范围匹配规则:

    如果未指定范围匹配规则, 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)

另请参阅