指定 WCF 适配器的消息内容

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

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

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

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

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 表达式的详细信息,请参阅“两个世界最佳:将 XPath 与 XmlReader 组合在一起 https://go.microsoft.com/fwlink/?LinkID=75701”。

如果选择了 路径 -- 正文路径 选项,并且将 节点编码 属性设置为 字符串,则 WCF 适配器期望匹配的节点具有 UTF-8 编码的字符数据。 如果传入消息包括用于 XML 特殊字符的转义字符数据(例如 < 和 >),则 WCF 适配器在创建 BizTalk 消息正文部件时将还原转义字符数据。 例如,如果匹配的节点包含转义的字符数据(如 <FirstName>CONTOSO</FirstName> ),则 WCF 适配器会在入站 BizTalk 消息体中生成 <FirstName>CONTOSO</FirstName>

如果选择了路径 -- 正文路径选项,并且Node 编码属性设置为HexBase64,则匹配的节点可以具有有效的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 消息正文 主体路径表达式 节点编码
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 元素应具有有效的 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 正文 元素的内容。 正文选项为 - BizTalk 响应消息正文(默认值)的 WCF 适配器不允许发送非 XML 格式的消息,例如字符数据和位图图像。 可以使用 模板 -- WCF 适配器的模板选项指定的内容来发送以 base64hex字符串编码的非 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>