CustomFindCriteria 示例演示如何使用逻辑创建自定义范围匹配,以及如何实现自定义发现服务。 客户端使用自定义范围匹配功能在系统提供的 WCF Discovery 查找功能基础之上进行优化并进一步生成。 此示例涵盖的方案如下所示:
客户正在寻找计算器服务。
若要优化搜索,客户端必须使用自定义范围匹配规则。
根据此规则,如果服务终结点与客户端指定的任何作用域匹配,服务将响应客户端。
演示
创建自定义发现服务。
按算法实现自定义范围匹配。
讨论
客户端正在寻找“OR”类型匹配条件。 如果其终结点上的作用域与客户端提供的任何范围匹配,服务会响应。 在这种情况下,客户端正在寻找具有以下列表中任何范围的计算器服务:
net.tcp://Microsoft.Samples.Discovery/RedmondLocationnet.tcp://Microsoft.Samples.Discovery/SeattleLocationnet.tcp://Microsoft.Samples.Discovery/PortlandLocation
为实现此功能,客户端指示服务通过按 URI 传入自定义范围匹配来使用自定义范围匹配规则。 为了方便自定义范围匹配,服务必须使用了解自定义范围匹配规则并实现关联的匹配逻辑的自定义发现服务。
在客户端项目中,打开Program.cs文件。 请注意,对象的ScopeMatchByFindCriteria字段设置为特定的 URI。 此标识符将发送到服务。 如果服务不了解此规则,它将忽略客户端的查找请求。
打开服务项目。 三个文件用于实现自定义发现服务:
AsyncResult.cs:这是发现方法所需的
AsyncResult实现。CustomDiscoveryService.cs:此文件实现自定义发现服务。 该实现扩展了 DiscoveryService 类,并重写了必要的方法。 请注意 OnBeginFind 方法的实现。 该方法进行检查以确定客户端是否指定了按规则进行的自定义范围匹配。 这与客户端之前指定的自定义 URI 相同。 如果指定了自定义规则,则遵循实现“OR”匹配逻辑的代码路径。
此自定义逻辑会遍历服务中每个终结点的所有范围。 如果终结点的任何作用域与客户端提供的任何作用域匹配,发现服务会将该终结点添加到发回客户端的响应。
CustomDiscoveryExtension.cs:实现发现服务的最后一步是将此自定义发现服务的实现连接到服务主机。 此处使用的帮助程序类是
CustomDiscoveryExtension类。 该类继承了 DiscoveryServiceExtension 类。 用户必须重写 GetDiscoveryService 方法。 在这种情况下,该方法返回之前创建的自定义发现服务的实例。PublishedEndpoints是 ReadOnlyCollection<T>,它包含要添加到 ServiceHost 的所有应用程序终结点。 自定义发现服务使用此服务来填充其内部列表。 用户还可以添加其他终结点元数据。
最后,打开Program.cs。 请注意,ServiceDiscoveryBehavior和CustomDiscoveryExtension都已添加到主机中。 完成此操作后,当主机拥有一个用于接收发现消息的终结点时,应用程序即可使用自定义发现服务。
请注意,客户端能够在不知道其地址的情况下找到服务。
设置、生成和运行示例
打开包含项目的解决方案。
构建项目。
运行服务应用程序。
运行客户端应用程序。