2016-11-02 9 views
1

Мой посыла-порт выдает ошибку и отказывается создавать XML из-за следующей ошибки:Это Ассемблер не может получить спецификацию документа, используя этот тип с клиентами SND_Pipeline

Error details: There was a failure executing the send pipeline "SND_WMS_301" Reason: This Assembler cannot retrieve a document specification using this type: "dcsmergedata".

Посыл-трубопровод является простой один, который имеет XML-ассемблер с добавленной схемой «Schema_XML_WMS_301» (я добавил скриншот трубопровода)

Когда я изменяю трубопровод, чтобы пройти, я создаю документ XML со следующим корнем

<dcsmergedata xsi:noNamespaceSchemaLocation="../lib/interface_order_header.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <dataheaders> 

Схема, по-видимому, была развернута и доступна на вкладке Schema в BizTalk. (второй снимок экрана)

Теперь я не понимаю, почему это может быть. Этот результат также кажется очень похожим, но напротив моего другого вопроса (Link), поэтому я чувствую, что делаю что-то не так с моими конвейерами.

send pipeline

Schema's deployed

+1

Можете ли вы изменить имя типа, чтобы у каждого было уникальное? – Dijkgraaf

+0

На самом деле, я думаю, что еще одна проблема заключается в том, что ваше DocumentSpecName является неполным (поскольку оно не содержит DLL, версию и открытый ключ) – Dijkgraaf

ответ

3

Проблема здесь выглядит похоже на ваш другой вопрос в том, что ваша полезная нагрузка XML не имеет имен. BizTalk ищет схемы по-разному.

1) Если вы не указали имя DocSpecName, оно делает это с помощью комбинации пространства имен и имени корневого узла. Если пространство имен отсутствует, оно будет пытаться только с именем корневого узла. Поскольку у вас несколько схем с одним корневым узлом, он не знает, какой из них использовать. Хорошая запись в блоге о различных причинах этой проблемы одна: Sandro Pereira

2) Если вы укажете DocumentSpecName в XML Dissasembler или Assembler, он использует имя типа, имя DLL, номер версии и открытый ключ токен, чтобы посмотреть его.

Это дает вам два варианта.

Вариант A: Добавить пространство имен в схему в BizTalk. Затем добавьте компонент конвейера Add Namespace в приемный трубопровод, который анализирует входящий XML, и компонент конвейера Remove Namespace в Send Pipeline, чтобы удалить это пространство имен. Таким образом, извне он не имеет этого пространства имен, внутренне в BizTalk.

Вариант B: Убедитесь, что схемы без пространства имен, но с тем же корневым именем, имеют уникальное имя DocumentSpecName.

  • Либо находятся в отдельном проекте.
  • Проживать в другом versin из DLL
  • имеют разный тип Name (Это, как правило, самый быстрый и лучший вариант)

Таким образом, когда вы указываете имя спецификации полный DOC (который должен включать в себя имя сборки) в ассемблере XML через Visual Studio, он найдет только одно соответствие схемы в этой DLL. Имя Docspec должно выглядеть как нечто вроде DBLOG.ValidateMessage.IntegerSchema, DBLOG.ValidateMessage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=349a4171d9432c58 в соответствии с ответом DocumentSpecNames?, который также ссылается на имя DLL, версию & Открытый ключ в дополнение к имени типа. На самом деле он всегда должен выглядеть так в XML-ассемблере или дизассемблере, даже если у вас есть пространство имен.

+1

Система, которая заканчивает чтение этого файла, имеет несколько требований, которые я не могу сделать с помощью passThrough. Для параметра сохранения сохраняется значение false и добавление xmldeclaration в значение True. Это создает файл, который может считывать целевая система. Как быстрый вопрос, как добавить пространство имен в решении biztalk? в основном создать схему с пространством имен и сопоставить ее с этой схемой, а затем использовать компонент пространства имен (ESB Toolkit), чтобы удалить его снова? – Andy

+1

Ну, все работает отлично, кроме удаления пространства имен. Я пытаюсь использовать компонент конвейера esb toolkit removeenamespace, но он замалчивает ошибку «Исключение типа» Microsoft.BizTalk.Message.Interop.BTSException. и больше ничего. В этой ошибке я вижу, что ошибка происходит в основном в портах приема/отправки, но мой текущий порт является файловым портом FILE. Это оставляет меня несколько потерянным в том, что не так. – Andy

+1

Я не уверен, что добавление и удаление пространств имен является решением. если я добавляю пространство имен, то удаляю его с удалением esb, мои тесты, похоже, указывают на «xsi: noNamespaceSchemaLocation =» ../ lib/interface_order_header.xsd «xmlns: xsi =» http://www.w3.org/2001/XMLSchema-instance "удаляется в noNamespaceSchemaLocation =" ../ lib/interface_order_header.xsd ". Я действительно не вижу способа считывания недостающих частей. – Andy