路由操作和答复操作:弥补协议不匹配情况

更新时间: 2015年7月

当消息发送方和消息接收方运行不同的消息协议时,就会出现协议不匹配的情况。在涉及桥接的典型 BizTalk 服务方案中,消息发送方会向桥接发送消息。桥接将处理该消息,然后将它发送到消息接收方。这意味着,在两种情形下必须纠正协议不匹配的情况:

  • 首先是在向消息接收方发送消息时。这适用于使用 XML 单向桥接和 XML“请求-答复”桥接的情况,因为在这两种情况下,消息都必须发送到消息接收方。这称为路由操作

  • 其次是在将消息接收方发来的响应消息发回到消息发送方时。这仅适用于使用 XML“请求-答复”桥接的情况,因为只有使用这种桥接时,才需要将响应发回到消息发送方。这称为答复操作

路由操作和答复操作根据你在“扩充”阶段定义的属性运行。

为了帮助理解如何使用路由操作来实现协议不匹配情况,让我们设想一个场景。在该场景中,必须通过 XML 单向桥接将一条 POX(无格式传统 XML)/REST 消息发送到 WCF 服务(但该服务应该接收 SOAP 消息)。发送到桥的消息是一个简单 XML 负载并且没有标头。而在另一方面,传出到 WCF 服务的消息必须定义了一些 SOAP 标头。为了弥补这种协议不匹配情况,配置桥接的人员需使用路由操作向传出消息分配一些相关的 SOAP 消息标头,例如 Action、MessageID 等。配置桥接并将它部署到 Service Bus 后,POX 消息将发送到桥接。在处理消息之后、将消息路由到 WCF 服务之前,在桥接的路由操作中指定的标头将印记在消息上,然后发送到 WCF 服务,因而弥补了协议不匹配情况。若要配置路由操作,请参阅The Routing Action

下表列出了如何使用路由操作在 BizTalk 服务项目的中间阶段(或目标)之间传输属性值:

 

从/到 到其他桥接 到队列和主题 到中继或外部服务终结点

从桥接

属性不能按原样(以键值对的形式)传输,但可以通过将其指定为传出消息标头(HTTP 或 SOAP)的值来进行传递

属性可以按原样(以键值对的形式)传输,并且可以作为传出消息标头的值进行传递

属性不能按原样(以键值对的形式)传输,但可以通过将其指定为传出消息标头(HTTP 或 SOAP)的值来进行传递。但是,桥设计人员有权强制要求传递可由中继或外部服务使用的相关标头。

答复操作与路由操作十分相似。唯一的差别在于,路由操作适用于将消息发送到目标消息接收方的情况(使用 XML 单向桥接或 XML“请求-答复”桥接时),而答复操作适用于需要将消息接收方发来的响应消息路由回到消息发送方的情况(仅适用于使用 XML“请求-答复”桥接时)。

只需将适用于路由操作的场景反转一下,即可更好地理解这一点。假设消息发送方需要通过 XML“请求-答复”桥接将一条 SOAP 消息发送到 REST 服务,而该服务应该接收 POX/REST 消息。发送到桥接的消息是包含所有相关标头的 SOAP 消息。将该消息路由到 REST 服务之前,桥接会隐式剥离消息标头,而只将 XML 负载发送到 REST 服务。来自 REST 服务的响应也是 POX 消息。将该 POX 响应消息发回到消息发送方之前,答复操作会先在该消息上印记消息标头,然后再将 SOAP 封装的消息发送到消息发送方。若要配置答复操作,请参阅 Create an XML Request-Reply Bridge

下表列出了如何使用答复操作将属性值从桥接传回到消息发送客户端:

 

从/到 到其他桥接 到中继或外部服务终结点

从桥接

属性不能按原样(以键值对的形式)传输,但可以通过将其指定为传出消息标头(HTTP 或 SOAP)的值来进行传递

属性不能按原样(以键值对的形式)传输,但可以通过将其指定为传出消息标头(HTTP 或 SOAP)的值来进行传递。但是,桥设计人员有权强制要求传递可由中继或外部服务使用的相关标头。

尽管你可以使用路由操作和答复操作来设置消息标头属性,但是,你必须注意以下几个要点:

  • 在使用 ToReplyTo SOAP 消息标头时必须小心。这是因为,底层绑定(例如 WCF 绑定)可能会重写这些消息标头。因此,如果使用这些消息的应用程序预期应该接收你通过路由操作或答复操作设置的消息标头,则可能会导致意外的错误。

  • 将消息路由到使用 basicHttpBindingbasicHttpRelayBinding 的终结点时,不能设置 MessageID SOAP 标头。

另请参阅

显示: