Windows Communication Foundation (WCF) 筛选系统可以使用声明性筛选器来匹配消息并做出作决策。 可以使用筛选器,通过检查邮件的一部分来确定如何处理邮件。 例如,队列过程可以使用 XPath 1.0 查询来检查已知标头的优先级元素,以确定是否将消息移到队列的前面。
筛选系统由一组类组成,这些类可以有效地确定一组筛选器适用于 true 特定 WCF 消息。
筛选系统是 WCF 消息传送的核心组件;它的设计速度非常快。 每个筛选器实现都针对 WCF 消息进行了特定类型的匹配优化。
筛选系统不是线程安全的。 应用程序必须处理所有锁定语义。 但是,它确实支持多读取器、单个编写器。
筛选的适用范围
在收到消息后执行筛选,并且是将消息调度到适当应用程序组件的过程的一部分。 筛选系统的设计解决了多个 WCF 子系统的要求,包括消息传送、路由、安全性、事件处理和系统管理。
过滤 器
筛选器引擎有两个主要组件,即筛选器和筛选器表。 筛选器根据用户指定的逻辑条件对消息做出布尔决策。 筛选器实现 MessageFilter 类。
这些 Match 方法用于确定消息是否满足筛选器。 其中一种方法测试消息的标头,但无法检查消息正文。 另一种方法采用 消息缓冲区 作为输入参数,并且可以检查消息正文。
筛选器通常不是单独测试的,而是作为筛选器表的一部分,这是该方法创建的泛型类 CreateFilterTable 。
每种筛选器都专门匹配特定类型的布尔条件。 构造筛选器后,无法更改筛选器使用的条件;若要修改筛选器的条件,请构造一个新筛选器并删除现有筛选器。
操作筛选器
ActionMessageFilter 包含一组动作字符串的列表。 如果筛选器列表中的任何操作与消息或消息缓冲区中的动作标头匹配,方法Match返回true。 如果列表为空,则该筛选器被视为一个万能筛选器,因此任何消息或消息缓冲区都会匹配,Match 返回 true。 如果筛选器列表中的任何操作与消息或消息缓冲区中的 Action 标头不匹配,Match 就会返回 false。 如果消息中没有动作,并且筛选器的列表为非空,则 Match 返回 false。
端点地址筛选器
根据 EndpointAddressMessageFilter 终结点地址筛选消息和消息缓冲区,如标头集合中所示。 要让消息通过此类筛选器,必须满足以下条件:
筛选器的地址统一资源标识符 (URI) 必须与消息 To 标头中的统一资源标识符相同。
筛选器(
address.Headers集合)地址中的每个终结点参数都必须在消息中找到要映射的标头。 消息或消息缓冲区中的额外标头可使匹配结果保持为true。
前缀终结点地址筛选器
- PrefixEndpointAddressMessageFilter 的工作方式与 EndpointAddressMessageFilter 筛选器非常类似,不同之处在于可以对消息 URI 的前缀进行匹配。 例如,指定地址
http://www.adatum.com的筛选器会匹配发送到http://www.adatum.com/userA的邮件。
XPath 消息筛选器
使用 XPathMessageFilter XPath 表达式来确定 XML 文档是否包含特定元素、属性、文本或其他 XML 语法构造。 该筛选器经过优化,可以非常高效地筛选 XPath 的严格子集。 W3C XML 路径语言 1.0 规范中介绍了 XML 路径语言。
通常,应用程序在终结点使用 XPathMessageFilter 查询 SOAP 消息的内容,然后根据该查询的结果采取适当的措施。 例如,队列过程可能使用 XPath 查询来检查已知标头的优先级元素,以确定是否将消息移到队列的前面。
筛选表
筛选器表用于存储键值对,其中筛选器是键,一些关联的数据是值。 筛选器数据可用于指示当消息与筛选器匹配且筛选器数据类型是筛选器表类的泛型参数时要执行的作。 筛选器数据可以包括路由规则、会话安全状态、通道上的侦听器等。 可以在需要数据流控制的位置使用数据。
筛选器表实现泛型接口 IMessageFilterTable<TFilterData>。
筛选器表有多个方法,这些方法与表中的所有筛选器匹配消息,并返回匹配筛选器或数据的无序集合。 某些匹配方法是多匹配方法,并返回所有匹配项。 其他方法是单匹配的,仅返回一个项,并在有多个筛选器匹配时引发 MultipleFilterMatchesException。
消息筛选器表
MessageFilterTable<TFilterData>是IMessageFilterTable<TFilterData>的最普遍实现。 可以在表中存储所有类型的筛选器。
可以将数字优先级分配给筛选器,其中最高优先级由最高数字表示。 多种类型的筛选器可以具有相同的优先级。 特定类型的筛选器可以出现在多个优先级级别。
匹配从最高优先级开始完成,如果找到具有给定优先级的匹配筛选器,则不会检查优先级较低的筛选器。 因此,如果使用单筛选器匹配方法,并且多个筛选器与消息匹配,但每个匹配筛选器具有不同的优先级,则不会引发异常,并返回优先级最高的筛选器。 同样,多筛选器匹配方法仅返回优先级最高的匹配筛选器。
XPath 消息筛选器表
XPathMessageFilterTable<TFilterData> 针对声明性 XPath 筛选器进行了优化,因此表键为 XPathMessageFilter。
该 XPathMessageFilterTable<TFilterData> 类优化了 XPath 子集的匹配,该子集涵盖了大多数消息传送方案,还支持完整的 XPath 1.0 语法。 它已针对高效并行匹配进行了优化算法。
此表具有几种特定的Match方法,用于在XPathNavigator和SeekableXPathNavigator上执行操作。 SeekableXPathNavigator扩展了XPathNavigator类,并添加了CurrentPosition属性。 此属性允许快速保存和加载 XML 文档中的位置,而无需克隆导航器,这是此类作所需的昂贵内存分配 XPathNavigator 。 WCF XPath 引擎必须经常记录游标在对 XML 文档执行查询的过程中的位置,因此为 SeekableXPathNavigator 消息处理提供了重要的优化。
客户场景
可以根据消息中包含的数据,随时使用筛选功能将消息发送到不同的处理模块。 两种典型方案是基于消息的操作码路由消息,并根据消息终结点地址对消息流进行解复用。
路线规划
终结点的侦听器侦听消息,这些消息在消息的 SOAP 标头中包含一个或多个操作码。 通过将一个包含操作代码的数组传递给其构造函数,可以创建一个 ActionMessageFilter,从而实现此功能。 它使用筛选器向 ListenerFactory 进行注册,因此只有当消息的操作与筛选器中的某个操作相匹配时,该消息才能到达该特定终结点。
多路分解
当多个终结点与同一个 ServiceListener 连接并散布在网络中时,若要对消息进行多路分解并了解消息是否属于某个终结点地址,唯一的方式是使用 EndpointAddressMessageFilter,此类筛选器通过对标头中存储的信息执行查找来选择发送到已注册终结点的消息。 在这些筛选器中,只有那些通过筛选的消息才具有所有必要的标头,这些标头同时对应于:
EndpointAddress中的 URIEndpointAddress中的其余终结点参数(如 EndpointAddressMessageFilter 中指定)。