发现查找操作是发现功能中的主要操作之一,它由客户端启动,用于发现一个或多个服务。执行查找时将通过网络发送一条 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。
终止条件包括:
Duration - 等待网络上的服务所发送答复的最长时间。默认持续时间为 20 秒。
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)