指定 WCF 适配器的消息正文

可以使用 WCF 适配器中的“ 消息 ”选项卡指定如何从传入的 SOAP 消息中提取 BizTalk 消息正文,以及如何将 BizTalk 消息正文放在传出 SOAP 消息中。

指定如何从传入 SOAP 消息提取 BizTalk 消息正文

可以控制如何从通过 WCF 适配器传入的 SOAP 消息创建入站 BizTalk 消息正文。 下图显示了 WCF-NetNamedPipe 接收适配器和发送适配器的“ 消息 ”选项卡作为示例。

WCF 中的“消息”选项卡接收适配器

58e1d490-5bd9-4571-87b1-4dea6dbfe2deWCF 发送适配器 中的

若要指定如何创建 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”,则匹配的节点可以具有有效的 BinHexBase64 序列。 如果匹配的节点的序列无效,则 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 元素应具有有效的 BinHexBase64 序列。

入站 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 消息正文部分编码为 BinHexBase64 序列。

如果 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>