路由服务是充当消息路由器的通用 SOAP 中介。 路由服务的核心功能是能够基于消息内容路由消息,这允许消息根据消息本身中的值转发到客户端终结点(在标头或消息正文中)。
RoutingService 在 System.ServiceModel.Routing 命名空间中作为 Windows Communication Foundation(WCF)服务实现。 路由服务公开一个或多个服务终结点,这些终结点接收消息,然后根据消息内容将每个消息路由到一个或多个客户端终结点。 该服务提供以下功能:
基于内容的路由
服务聚合
服务版本控制
优先级路由
动态配置
协议桥接
SOAP 处理
高级错误处理
备份端点
虽然可以创建实现其中一个或多个目标的中介服务,但此类实现通常与特定方案或解决方案相关联,并且无法轻松地应用于新应用程序。
路由服务提供与 WCF 服务和通道模型兼容的通用、动态可配置的可插入 SOAP 中介,并允许你执行基于 SOAP 的消息的基于内容的路由。
注释
路由服务当前不支持 WCF REST 服务的路由。 若要路由 REST 调用,请考虑使用 System.Web.Routing 或 应用程序请求路由。
基于内容的路由
基于内容的路由是能够基于消息中包含的一个或多个值路由消息。 路由服务会检查每个消息,并根据创建的消息内容和路由逻辑将其路由到目标终结点。 基于内容的路由为服务聚合、服务版本控制以及优先级路由提供了基础。
为了实现基于内容的路由,路由服务依赖于 MessageFilter 用于匹配要路由的消息中的特定值的实现。 如果 MessageFilter 与消息匹配,消息将路由到与 MessageFilter 关联的目标终结点。 消息筛选器将分组到筛选器表(FilterTableCollection)中,以构造复杂的路由逻辑。 例如,筛选器表可能包含五个互斥消息筛选器,这些筛选器导致消息仅路由到五个目标终结点之一。
通过路由服务,可以配置用于执行基于内容的路由的逻辑,并在运行时动态更新路由逻辑。
通过将消息筛选器分组到筛选器表中,可以构造路由逻辑,以便处理多个路由方案,例如:
服务聚合
服务版本控制
优先级路由
动态配置
有关消息筛选器和筛选器表的详细信息,请参阅 路由简介 和 消息筛选器。
服务聚合
通过使用基于内容的路由,可以公开一个终结点,该终结点接收来自外部客户端应用程序的消息,然后根据消息中的值将每个消息路由到相应的内部终结点。 这对于为各种后端应用程序提供一个特定终结点非常有用,还可以向客户提供一个应用程序终结点,同时将应用程序分解为各种服务。
服务版本控制
迁移到新版解决方案时,可能需要并行维护旧版本才能为现有客户提供服务。 通常,这要求连接到较新版本的客户端在与解决方案通信时必须使用其他地址。 通过路由服务,可以通过根据消息中包含的特定于版本的信息将消息路由到适当的解决方案,公开一个服务终结点,该终结点为解决方案的这两个版本提供服务。 有关此类实现的示例,请参阅 How To: Service Versioning。
优先路由
为多个客户提供服务时,你可能会与一些合作伙伴签订服务级别协议(SLA),要求将这些合作伙伴的所有数据与其他客户的数据分开处理。 通过使用查找消息中包含的特定于客户的信息的筛选器,可以轻松地将消息从特定合作伙伴路由到已创建的终结点以满足其 SLA 要求。
动态配置
若要支持任务关键型系统(必须在不中断任何服务中断的情况下处理消息),必须在运行时修改系统中组件的配置。 为了支持此需求,路由服务提供了一个 IExtension<T> 实现, RoutingExtension该实现允许在运行时动态更新路由服务配置。
有关路由服务的动态配置的详细信息,请参阅 路由简介。
协议桥接
中间方案中的一个难题是,内部终结点的传输或 SOAP 版本要求可能与接收消息的终结点不同。 为了支持此方案,路由服务可以桥接协议,包括将 SOAP 消息处理成目标终结点所需的协议MessageVersion。 这样,一个协议可用于内部通信,另一个协议可用于外部通信。
为了支持在不同传输的终结点之间路由消息,路由服务使用系统提供的绑定,使服务能够桥接不同的协议。 当路由服务公开的服务终结点使用与消息路由到的客户端终结点不同的协议时,会自动发生这种情况。
SOAP 处理
常见的路由要求是能够在具有不同 SOAP 要求的终结点之间路由消息。 为了支持此要求,路由服务提供一个 SoapProcessingBehavior,该组件在将消息路由至目标终结点之前,自动创建一个满足目标终结点要求的新的 MessageVersion。 此行为还会为任何响应消息创建新的 MessageVersion ,然后再将其返回到请求客户端应用程序,以确保响应的 MessageVersion 与原始请求的 MessageVersion 匹配。
有关 SOAP 处理的详细信息,请参阅 路由简介。
错误处理
在由依赖于网络通信的分布式服务组成的系统中,必须确保系统中的通信能够抵御暂时性网络故障。 路由服务实现错误处理,使你能够处理许多可能导致服务中断的通信故障方案。
如果路由服务在尝试发送消息时遇到 CommunicationException 问题,则会发生错误处理。 这些异常通常表示尝试与定义的客户端终结点(例如EndpointNotFoundExceptionServerTooBusyException,或CommunicationObjectFaultedException)通信时遇到问题。 错误处理代码还会捕获并尝试在 TimeoutException 发生时重试发送,这是另一个不派生自 CommunicationException 的常见异常。
有关错误处理的详细信息,请参阅 路由简介。
备份终结点
除了与筛选器表中每个筛选器定义关联的目标客户端终结点外,还可以创建一个备份终结点列表,在传输失败时,消息将路由到该终结点。 如果发生错误,并且为筛选器条目定义了备份列表,则路由服务将尝试将消息发送到列表中定义的第一个终结点。 如果此传输尝试失败,服务将尝试下一终结点,并继续此过程,直到传输尝试成功、返回与传输相关的错误,或者备份列表中的所有终结点都返回传输错误。
有关备份终结点的详细信息,请参阅 路由简介 和 消息筛选器。
流媒体
如果将绑定设置为支持流式处理,则路由服务可以成功流式传输消息。 但是,在某些情况下,可能需要缓冲消息:
多播(缓冲以创建更多消息副本)
故障转移(缓冲以免消息需要发送到备份)
System.ServiceModel.Routing.RoutingConfiguration.RouteOnHeadersOnly 为 false(缓冲以提供带有 MessageBuffer 的 MessageFilterTable,以便筛选器可以检查正文)
动态配置