指定 WCF 适配器的消息正文
可以使用 WCF 适配器中的“ 消息 ”选项卡指定如何从传入的 SOAP 消息中提取 BizTalk 消息正文,以及如何将 BizTalk 消息正文放在传出 SOAP 消息中。
指定如何从传入 SOAP 消息提取 BizTalk 消息正文
可以控制如何从通过 WCF 适配器传入的 SOAP 消息创建入站 BizTalk 消息正文。 下图显示了 WCF-NetNamedPipe 接收适配器和发送适配器的“ 消息 ”选项卡作为示例。
WCF 发送适配器 中的
若要指定如何创建 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 表达式的详细信息,请参阅 中的 https://go.microsoft.com/fwlink/?LinkID=75701“两全其美:将 XPath 与 XmlReader 相结合”。
如果选择了 “路径 -- 按正文路径找到的内容 ”选项,并且 “节点编码 ”属性设置为 “字符串”,则 WCF 适配器预期匹配的节点具有 UTF-8 编码的字符数据。 如果传入消息包含 XML 特殊字符(如 和 >)<的转义字符数据,则 WCF 适配器在创建 BizTalk 消息正文部件时还原转义字符数据。 例如,如果匹配的节点具有转义字符数据(如 <FirstName>CONTOSO</FirstName> ),则 WCF 适配器 <会在入站 BizTalk 消息正文中创建 FirstName>CONTOSO</FirstName> 。
如果选择了 “路径 -- 按正文路径查找的内容 ”选项,并且 “节点编码 ”属性设置为 “十六进制 ”或“ 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 消息正文 | 正文路径表达式 | 节点编码 |
---|---|---|
正文 -- soap:Body> 元素的内容< | N/A | 不可用 |
如果按下表所示配置 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 Body 元素的内容。 具有 正文 -- BizTalk 响应消息正文 的 WCF 适配器 (默认值) 选项不允许发送非 XML 消息,例如字符数据和位图图像。 可以使用 模板 -- 模板为 WCF 适配器指定的内容 选项发送以 base64、 十六进制或 字符串编码的非 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>