使用英语阅读

通过


指定 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>