BizTalk WCF-WebHttp сопоставление переменной данных формы с множественными узлами

API моего клиента требует, чтобы переменные данные доставлялись им через HTTP POST. Некоторые из этих данных сопоставляются с URL-адресом, а некоторые данные находятся в переменных формы тела сообщения:

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

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

Порт WCF-WebHttp кажется билетом. Достаточно легко определить схему плоского файла для переменных тела сообщения (carrier, trackingNumber и shipDate).

btsnip

Моя проблема заключается в сопоставлении переменной URL-адреса для poNumber в конфигурации порта отправки. Я хочу сделать что-то вроде этого:

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

Учитывая, что с помощью схемы свойств можно продвигать только узлы с одним вхождением, я не могу сопоставить данные poNumber с теми же узлами, с которыми я сопоставляю переменные тела сообщения, и не хочу, чтобы имя / значение poNumber было включено в тело сообщения.

Я достиг ограничений этого конкретного адаптера?


person Doug Griffin    schedule 21.12.2018    source источник
comment
Так откуда берется poNumber? немного непонятно. Вы можете предоставить нам образец полезной нагрузки? например Payload перед тем, как вы сопоставите его с вашим телом HttpRequest. И нет, я не думаю, что вы достигли ограничения, вы, вероятно, можете определить свойство «Только контекст сообщения» для poNumber.   -  person Dijkgraaf    schedule 23.12.2018
comment
Уточните, пожалуйста, один момент. API - это единственный экземпляр (заказа на поставку), поэтому вам не следует начинать с повторяющихся номеров заказов. Похоже, что настоящая проблема.   -  person Johns-305    schedule 24.12.2018
comment
Привет, Джонс-305. У меня нет повторяющихся номеров заказов на поставку в моем входном сообщении. У меня есть одно значение, которое нужно отправить клиентскому API как часть URL-адреса, но это значение не может отображаться в самом теле сообщения.   -  person Doug Griffin    schedule 04.01.2019


Ответы (1)


Предполагая, что повторяющийся узел, о котором вы говорите, находится в схеме назначения, идущей к WCF-WebHttp adatper, и что poNumber находится в неповторяющемся узле в схеме, из которой вы выполняете сопоставление.

Что вам нужно сделать, так это создать схему свойств, в которой вы определяете poNumber как MessageContextPropertyBase

Схема собственности

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>

Свойство контекста в сообщении Из входной схемы оно будет продвигать свойство, и оно все еще будет существовать после выполнения карты.

Отображение свойства контекста все еще существует после карты на порту отправки

Свойство контекста

person Dijkgraaf    schedule 24.12.2018
comment
Спасибо Dijkgraaf за то, что нашли время ответить с такой полезной подробностью. Я не знал, что свойство контекста может быть установлено таким образом. Однако это не решило мою проблему. Значение действительно правильно отображается на URL-адрес, как описано, однако оно также появляется в теле сообщения, что является проблемой. Когда я отправляю свое сообщение в плоский конвейер: Выполнено: carrier = FEDEX & trackingNumber = 4XXXXXX & shipDate = 2018-12-17 ...... Фактически: 111111111carrier = FEDEX & trackingNumber = 4XXXXXX & shipDate = 2018-12-17 (111111111 - номер заказа. ... должен отображаться только на URL, а не на сообщение) - person Doug Griffin; 04.01.2019
comment
@DougGriffin Значит, у вас есть проблема на вашей карте, которая создает полезную нагрузку. Можете ли вы добавить детали вашей карты к вопросу и образец полезной нагрузки, а также результат (желаемый или фактический согласно вашему комментарию)? Если вы посмотрите на мою карту, я не сопоставляю номер заказа с выходным сообщением. Возможно также конфигурация вашего порта отправки. - person Dijkgraaf; 05.01.2019