可以使用 WCF 适配器中的 “消息 ”选项卡指定如何从传入的 SOAP 消息中提取 BizTalk 消息正文,以及如何将 BizTalk 消息正文置于传出 SOAP 消息中。
指定如何从传入 SOAP 消息中提取 BizTalk 消息正文
可以控制如何从通过 WCF 适配器传入的 SOAP 消息创建入站 BizTalk 消息正文。 下图所示为 WCF-NetNamedPipe 接收适配器和发送适配器的消息选项卡示例。
若要指定如何创建 BizTalk 消息正文,请在上图的 “入站 BizTalk 消息正文 ”部分选择以下选项之一:
信封——完整 <soap:Envelope>。 使用传入消息的 SOAP Envelope 元素创建 BizTalk 消息正文部件。 整个传入消息将成为 BizTalk 消息正文。 使用此选项可创建合并所有标头的 BizTalk 消息正文。
注释
SOAP 标头被放置在消息上下文中,但不会自动提升。 可以在自定义管道组件中完成促销。
正文 - <soap:Body> 元素的内容。 使用传入消息的 SOAP Body 元素的内容来创建 BizTalk 消息正文部件。 如果 Body 元素具有多个子元素,则只有第一个元素成为 BizTalk 消息正文部分。
路径 -- 按正文路径定位的内容。 使用 正文路径表达式 文本框中的正文路径表达式来创建 BizTalk 消息正文部分。 根据传入消息的 SOAP Body 元素的即时子元素计算正文路径表达式。 当传入消息具有二进制数据时,可以将此选项用于 BizTalk 消息正文,以仅包含没有任何标记的二进制数据。
选择 “路径 -- 正文路径”选项定位的内容 时,可以将 Node 编码(节点编码) 属性配置为在 “正文路径表达式” 文本框中指定的正文路径表达式所确定的节点的预期编码类型。 如果正文路径表达式与多个元素匹配,则仅使用第一个匹配元素。
注释
对于 正文路径表达式 属性,仅支持适用于仅向前处理 XML 的 XPath 表达式。 有关可用于此属性的 XPath 表达式的详细信息,请参阅“两个世界最佳:将 XPath 与 XmlReader 组合在一起 https://go.microsoft.com/fwlink/?LinkID=75701”。
如果选择了 路径 -- 正文路径 选项,并且将 节点编码 属性设置为 字符串,则 WCF 适配器期望匹配的节点具有 UTF-8 编码的字符数据。 如果传入消息包括用于 XML 特殊字符的转义字符数据(例如 < 和 >),则 WCF 适配器在创建 BizTalk 消息正文部件时将还原转义字符数据。 例如,如果匹配的节点包含转义的字符数据(如 <FirstName>CONTOSO</FirstName> ),则 WCF 适配器会在入站 BizTalk 消息体中生成 <FirstName>CONTOSO</FirstName>。
如果选择了路径 -- 正文路径选项,并且Node 编码属性设置为Hex或Base64,则匹配的节点可以具有有效的BinHex或Base64序列。 如果匹配的节点序列无效,WCF 客户端将收到 FaultException,在 BizTalk Server 计算机上的事件日志中记录错误消息,并且没有消息会被挂起。
如果选择 路径 -- 由正文路径定位的内容 选项,并且 Node 编码 属性设置为 XML,则 WCF 适配器会创建 BizTalk 消息正文,使用由 正文路径表达式 文本框中的正文路径表达式选择的节点的外部 XML。
如果匹配的节点未按 Node 编码 属性中指定的数据进行编码,则会创建一个空的入站 BizTalk 消息正文。
例如,假设 WCF 发送适配器从 WCF 客户端接收以下 SOAP 消息:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess/IOrderProcess/OrderRefresh</a:Action>
<a:MessageID>urn:uuid:59e74507-66d0-4d50-be70-c3ec248b6f78</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">net.pipe://mycomputer/NetNamedPipeOrderProcessServiceBizTalk</a:To>
</s:Header>
<s:Body>
<Order xmlns="http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess">
<OrderDetail>
<CustomerID>CONTOSO</CustomerID>
<OrderID>00000000</OrderID>
</OrderDetail>
</Order>
</s:Body>
</s:Envelope>
如果配置 入站 BizTalk 消息正文 部分,如下表所示,以前的传入 SOAP 消息将成为入站 BizTalk 消息正文部分。
入站的 BizTalk 消息正文 | 主体路径表达式 | 节点编码 |
---|---|---|
信封 -- 全部<soap:Envelope> | 无 | 无 |
如果配置 BizTalk 消息正文 部分,如下表所示,WCF 适配器会创建入站 BizTalk 消息正文部分,以仅包含上一个传入 SOAP 消息中的 Order 元素。
入站 BizTalk 消息正文 | 主体路径表达式 | 节点编码 |
---|---|---|
Body -- <soap:Body> 元素的内容 | 无 | 无 |
如果按照下表配置BizTalk 消息正文部分,WCF 适配器会期望与正文路径表达式匹配的传入节点包含 UTF-8 编码的字符数据。
入站 BizTalk 消息正文 | 主体路径表达式 | 节点编码 |
---|---|---|
路径 -- 按正文路径定位的内容 | /*[local-name()='Order']/*[local-name()='OrderDetail']/*[local-name()='CustomerID'] | 字符串 |
对于以前的传入 SOAP 消息,WCF 适配器使用 CustomerID 元素的字符数据 CONTOSO 来创建入站 BizTalk 消息正文部分。
注释
不能对以前的传入 SOAP 消息使用 XPath、 /Order/OrderDetail/CustomerID 的缩写语法。 这是因为 XPath 的缩写语法返回命名空间中未声明的节点,并且上一个 SOAP 消息中的 CustomerID 元素默认在命名空间中 http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess
声明。
如果按下表所示配置 BizTalk 消息正文 部分,则上一个传入 SOAP 消息中的 CustomID 元素应具有有效的 BinHex 或 Base64 序列。
入站 BizTalk 消息正文 | 主体路径表达式 | 节点编码 |
---|---|---|
路径 -- 按正文路径定位的内容 | /*[local-name()='Order']/*[local-name()='OrderDetail']/*[local-name()='CustomerID'] | 十六进制 或 Base64 |
如果按下表所示配置 BizTalk 消息正文 部分,WCF 适配器将为上一个传入 SOAP 消息创建入站 BizTalk 消息正文,如表后面的代码所示。
入站 BizTalk 消息正文 | 主体路径表达式 | 节点编码 |
---|---|---|
路径 -- 按正文路径定位的内容 | /*[local-name()='Order']/*[local-name()='OrderDetail']/*[local-name()='CustomerID'] | XML |
<CustomerID xmlns="http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess">CONTOSO</CustomerID>
指定出站 WCF 消息正文的源
可以控制如何从 BizTalk 消息正文创建出站 WCF 消息正文以通过 WCF 适配器发送。 若要指定 BizTalk 消息正文在出站 WCF 消息正文中的放置方式,可以在“消息”选项卡上的“出站 WCF 消息正文”部分中使用以下选项之一,如上一部分的图中所示:
正文 -- BizTalk 响应消息正文。 使用 BizTalk 消息主体部分为传出消息创建 SOAP Body 元素的内容。 传出 BizTalk 消息正文将成为出站 SOAP 消息的正文。
模板 - 模板指定的内容。 使用 XML 文本框中提供的模板为传出消息创建 SOAP 正文 元素的内容。 正文选项为 - BizTalk 响应消息正文(默认值)的 WCF 适配器不允许发送非 XML 格式的消息,例如字符数据和位图图像。 可以使用 模板 -- WCF 适配器的模板选项指定的内容来发送以 base64、 hex 或 字符串编码的非 XML 消息。
选择 模板 -- 模板选项指定的内容 时,必须在 出站 WCF 消息正文 - XML 文本框中提供任意模板 XML 元素。 模板 XML 元素必须包含以下 bts-msg-body 元素一次,并且只有一次,除非模板 XML 元素留空:
<bts-msg-body xmlns="http://www.microsoft.com/schemas/bts2010" encoding="[base64|hex|string|xml]"/>
WCF 适配器根据 XML 模板中的编码属性对 BizTalk 消息正文进行 编码 ,然后在创建出站 WCF 消息时将 bts-msg-body 元素替换为编码的 BizTalk 消息正文。 如果 出站 WCF 消息正文 - XML 文本框留空,WCF 适配器将在 Base64 中对 BizTalk 消息正文进行编码,然后将 Base64 序列置于出站 SOAP 消息正文中。
如果 XML 模板中的 编码 属性设置为 字符串,那么 WCF 适配器会将 BizTalk 消息的正文部分编码为 UTF-8 格式的字符数据,其中例如 < 和 > 这类 XML 特殊字符都会被转义。
如果 XML 模板中的 编码 属性设置为 base64 或 十六进制,WCF 适配器会将 BizTalk 消息正文部件编码为 BinHex 或 Base64 序列。
如果 XML 模板中的 编码 属性设置为 xml,WCF 适配器会将 bts-msg-body 元素替换为出站 BizTalk 消息正文以创建传出 WCF 消息。
例如,假设 WCF 适配器需要将以下 BizTalk 消息正文部分发送到 WCF 客户端:
<ns0:Order xmlns:ns0="http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess">
<ns0:OrderDetail>
<ns0:CustomerID>CONTOSO</ns0:CustomerID>
<ns0:OrderID>01A2c</ns0:OrderID>
</ns0:OrderDetail>
</ns0:Order>
如果按下表所示配置 出站 WCF 消息正文 部分,WCF 适配器将创建出站 WCF 消息,如表后面的代码所示。
出站 WCF 消息正文 | XML |
---|---|
正文 -- BizTalk 响应消息正文 | 无 |
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess/IOrderProcess/Request</a:Action>
<a:MessageID>urn:uuid:6a706a54-c4f5-4767-909d-a992c7c26dba</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">net.pipe://mycomputer/NetNamedPipeOrderProcessService</a:To>
</s:Header>
<s:Body>
<ns0:Order xmlns:ns0="http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess">
<ns0:OrderDetail>
<ns0:CustomerID>CONTOSO</ns0:CustomerID>
<ns0:OrderID>01A2c</ns0:OrderID>
</ns0:OrderDetail>
</ns0:Order>
</s:Body>
</s:Envelope>
如果按下表所示配置 出站 WCF 消息正文 部分,WCF 适配器将创建出站 WCF 消息,如表后面的代码所示。
出站“WCF”消息正文 | XML |
---|---|
正文 -- BizTalk 响应消息正文 | <Book><bts-msg-body xmlns="http://www.microsoft.com/schemas/bts2010" encoding="string"/></Book> |
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess/IOrderProcess/Request</a:Action>
<a:MessageID>urn:uuid:05dde292-eedd-467e-b0d2-f1b8f0757410</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">net.pipe://mycomputer/NetNamedPipeOrderProcessService</a:To>
</s:Header>
<s:Body>
<Book><ns0:Order xmlns:ns0="http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess"> <ns0:OrderDetail> <ns0:CustomerID>CONTOSO</ns0:CustomerID> <ns0:OrderID> 01A2c</ns0:OrderID> </ns0:OrderDetail></ns0:Order>
</Book>
</s:Body>
</s:Envelope>
如果按下表所示配置 出站 WCF 消息正文 部分,WCF 适配器将创建出站 WCF 消息,如表后面的代码所示。
出站 WCF 消息正文 | XML |
---|---|
正文 -- BizTalk 响应消息正文 | <Book><bts-msg-body xmlns="http://www.microsoft.com/schemas/bts2010" encoding="base64"/></Book> |
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://ww
w.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://Microsoft.Samples.BizTalk.NetNamedPipe
/OrderProcess/IOrderProcess/Request</a:Action>
<a:MessageID>urn:uuid:cb3cac6d-a542-4a90-bad8-cdbfa8251112</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">net.pipe://mycomputer/NetNamedPipeOrderProcessSer
vice</a:To>
</s:Header>
<s:Body>
<Book>77u/PG5zMDpPcmRlciB4bWxuczpuczA9Imh0dHA6Ly9NaWNyb3NvZnQuU2FtcGxlcy5CaX
pUYWxrLk5ldE5hbWVkUGlwZS9PcmRlclByb2Nlc3MiPg0KICA8bnMwOk9yZGVyRGV0YWlsPg0KICAgID
xuczA6Q3VzdG9tZXJJRD5DT05UT1NPPC9uczA6Q3VzdG9tZXJJRD4NCiAgICA8bnMwOk9yZGVySUQ+MD
FBMmM8L25zMDpPcmRlcklEPg0KICA8L25zMDpPcmRlckRldGFpbD4NCjwvbnMwOk9yZGVyPg==</Book
>
</s:Body>
</s:Envelope>
如果按下表所示配置 出站 WCF 消息正文 部分,WCF 适配器将创建出站 WCF 消息,如表后面的代码所示。
出站 WCF 消息正文 | XML |
---|---|
正文 -- BizTalk 响应消息正文 | <Book><bts-msg-body xmlns="http://www.microsoft.com/schemas/bts2010" encoding="xml"/></Book> |
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess/IOrderProcess/Request</a:A
ction>
<a:MessageID>{513C123C-0600-4A1C-BEE2-EF83E0EFEB15}</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">net.pipe://mycomputer/NetNamedPipeOrderProcessServiceBizTalk</a:To>
</s:Header>
<s:Body>
<Book>
<ns0:Order xmlns:ns0="http://Microsoft.Samples.BizTalk.NetNamedPipe/OrderProcess">
<ns0:OrderDetail>
<ns0:CustomerID>CustomerID_0</ns0:CustomerID>
<ns0:OrderID>OrderID_0</ns0:OrderID>
</ns0:OrderDetail>
</ns0:Order>
</Book>
</s:Body>
</s:Envelope>