【问题标题】:BizTalk WCF-WebHttp mapping form-data variable from multi-occurrence nodes来自多出现节点的 BizTalk WCF-WebHttp 映射表单数据变量
【发布时间】:2018-12-21 23:20:43
【问题描述】:

我客户的 API 需要通过 HTTP POST 将可变数据传送给他们。其中一些数据映射到 URL,而一些数据在消息体表单变量中:

Url: http://myclientapi.com/poNumber/111222/complete

Message body variables: carrier=FEDEX&trackingNumber=4XXXXXX&shipDate=2018-12-17

WCF-WebHttp 端口似乎是门票。为消息正文变量(运营商、trackingNumber 和 shipDate)定义平面文件模式很容易。

我的问题是发送端口配置中 poNumber 的 URL 变量映射。我想做这样的事情:

<BtsHttpUrlMapping>
    <Operation Name = "POSHIPPED" Method="POST" Url="/poNumber/{poNumber}/complete"/>
</BtsHttpUrlMapping>

鉴于只能通过属性架构提升单个出现节点,我无法将 poNumber 数据映射到我映射消息正文变量的相同节点,我也不希望 poNumber 名称/值包含在消息正文中。

我是否已达到此特定适配器的限制?

【问题讨论】:

  • 那么 poNumber 是从哪里来的呢?有点不清楚。你能给我们一个样本有效载荷吗?例如在您将 HttpRequest 正文映射到它之前的有效负载。不,我认为您没有达到限制,您可能可以为 poNumber 定义一个 Message Context Only 提升属性。
  • 请澄清一点。 API 是(PO 的)单一实例,因此您不应该一开始就使用重复的 PO 编号。似乎是真正的问题。
  • 您好 Johns-305。我的输入消息中没有重复的采购订单编号。我有一个值需要作为 URL 的一部分发送到客户端的 API,但该值不能出现在消息正文中。

标签: biztalk biztalk-2013


【解决方案1】:

假设您正在谈论的重复节点位于前往 WCF-WebHttp adatper 的目标架构中,并且 poNumber 位于您从中映射的架构上的非重复节点中。

您需要做的是创建一个 Property Schema,在其中将 poNumber 定义为 MessageContextPropertyBase

属性架构

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.SO53891801propertyschema" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://Scratch.SO53891801propertyschema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <b:schemaInfo schema_type="property" />
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="poNumber" type="xs:string">
    <xs:annotation>
      <xs:appinfo>
        <b:fieldInfo propertyGuid="3acc0f2f-64b0-4057-bc59-b8c76ab220a1" propSchFieldBase="MessageContextPropertyBase" />
      </xs:appinfo>
    </xs:annotation>
  </xs:element>
</xs:schema>

您将此属性架构添加到您的输入架构。从您的 orderNumber 在非重复节点中的输入中,您将 poNumber 链接到属性。

示例输入架构

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.SO53891801_input" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:ns0="http://Scratch.SO53891801propertyschema" targetNamespace="http://Scratch.SO53891801_input" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <b:imports>
        <b:namespace prefix="ns0" uri="http://Scratch.SO53891801propertyschema" location=".\SO53891801propertyschema.xsd" />
      </b:imports>
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="Root">
    <xs:annotation>
      <xs:appinfo>
        <b:properties>
          <b:property name="ns0:poNumber" xpath="/*[local-name()='Root' and namespace-uri()='http://Scratch.SO53891801_input']/*[local-name()='poNumber' and namespace-uri()='']" />
        </b:properties>
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="poNumber" type="xs:string" />
        <xs:element name="carrier" type="xs:string" />
        <xs:element name="trackingNumber" type="xs:string" />
        <xs:element name="shipDate" type="xs:date" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

示例输入文件

<ns0:Root xmlns:ns0="http://Scratch.SO53891801_input">
  <poNumber>poNumber_0</poNumber>
  <carrier>carrier_0</carrier>
  <trackingNumber>trackingNumber_0</trackingNumber>
  <shipDate>1999-05-31</shipDate>
</ns0:Root>

示例输出架构

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.SO53891801" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://Scratch.SO53891801" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="HttpRequestBody">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="FromValue">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Id" type="xs:string" />
              <xs:element name="Value" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

在两者之间创建地图。

地图

<?xml version="1.0" encoding="utf-16"?>
<mapsource Name="BizTalk Map" Version="2" BizTalkServerMapperTool_Version="3.0" XRange="100" YRange="420" OmitXmlDeclaration="Yes" UseXSLTransform="Undefined" TreatElementsAsRecords="No" OptimizeValueMapping="Yes" GenerateDefaultFixedNodes="Yes" PreserveSequenceOrder="No" IgnoreNamespacesForLinks="Yes" method="xml" CopyPIs="No" xmlVersion="1.0">
    <SrcTree RootNode_Name="Root">
        <Reference Location=".\SO53891801-input.xsd" />
    </SrcTree>
    <TrgTree RootNode_Name="HttpRequestBody">
        <Reference Location=".\SO53891801.xsd" />
    </TrgTree>
    <ScriptTypePrecedence>
        <CSharp Enabled="Yes" />
        <ExternalAssembly Enabled="Yes" />
        <VbNet Enabled="Yes" />
        <JScript Enabled="Yes" />
        <XsltCallTemplate Enabled="Yes" />
        <Xslt Enabled="Yes" />
    </ScriptTypePrecedence>
    <TreeValues>
        <TestValues />
        <ConstantValues />
    </TreeValues>
    <Pages>
        <Page Name="Page 1">
            <Links>
                <Link LinkID="1" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='carrier']" LinkTo="1" />
                <Link LinkID="2" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='trackingNumber']" LinkTo="1" />
                <Link LinkID="3" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='shipDate']" LinkTo="1" />
                <Link LinkID="4" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='carrier']" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']/*[local-name()='Value']" />
                <Link LinkID="5" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='trackingNumber']" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']/*[local-name()='Value']" />
                <Link LinkID="6" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='shipDate']" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']/*[local-name()='Value']" />
                <Link LinkID="7" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='carrier']" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']/*[local-name()='Id']" Compiler-Copy-Directive="CopyName" />
                <Link LinkID="8" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='trackingNumber']" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']/*[local-name()='Id']" Compiler-Copy-Directive="CopyName" />
                <Link LinkID="9" LinkFrom="/*[local-name()='&lt;Schema&gt;']/*[local-name()='Root']/*[local-name()='shipDate']" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']/*[local-name()='Id']" Compiler-Copy-Directive="CopyName" />
                <Link LinkID="10" LinkFrom="1" LinkTo="/*[local-name()='&lt;Schema&gt;']/*[local-name()='HttpRequestBody']/*[local-name()='FromValue']" />
            </Links>
            <Functoids>
                <Functoid FunctoidID="1" Functoid-FID="424" X-Cell="53" Y-Cell="173">
                    <Input-Parameters>
                        <Parameter Type="link" Value="1" linkIndex="0" Guid="7932e28c-0c98-4f47-aea8-f9a3a709eef0" />
                        <Parameter Type="link" Value="2" linkIndex="1" Guid="44112afb-3729-4d14-ba00-9053c96964a4" />
                        <Parameter Type="link" Value="3" linkIndex="2" Guid="eaecaba3-61c0-4cea-ae1b-16316322cea6" />
                    </Input-Parameters>
                </Functoid>
            </Functoids>
        </Page>
    </Pages>
</mapsource>

消息中的上下文属性 从输入模式中,它将提升属性,并且在地图执行后它仍然存在。

在发送端口上映射后显示上下文属性仍然存在

【讨论】:

  • 感谢 Dijkgraaf 抽出宝贵时间回复这些有用的细节。我不知道可以以这种方式设置上下文属性。但是,它并没有解决我的问题。如所述,该值确实正确映射到 URL,但是它也出现在消息正文中,这是一个问题。当我将消息推送出一个扁平的管道时: 预期:carrier=FEDEX&trackingNumber=4XXXXXX&shipDate=2018-12-17......实际:111111111carrier=FEDEX&trackingNumber=4XXXXXX&shipDate=2018-12-17(111111111 是订单号。 ...应该只映射到 URL,而不是消息)
  • @DougGriffin 那么您的地图中存在创建有效负载的问题。您能否将地图的详细信息添加到问题和示例有效负载以及输出(根据您的评论所需的与实际的)?如果您查看我的地图,我不会将 PO 编号映射到输出消息。也可能是您发送端口上的配置。
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 2020-10-17
  • 1970-01-01
  • 2020-01-18
  • 2017-06-09
  • 1970-01-01
  • 2014-01-05
  • 2016-06-26
相关资源
最近更新 更多