Функтоид сценариев Biztalk и документы

У меня есть скриптовый функтоид на карте. Мне нужно передать сообщение параметру метода и вернуть связанный документ. Метод, который, как я думал, будет работать, будет следующим:

public XLANGMessage Map(XLANGMessage src);

Однако я не могу найти подтверждения; могу ли я передать все сообщение через инструмент сопоставления, обработать его как документ и вернуть ответ? Верен ли мой подход?


person Brian Mains    schedule 26.02.2015    source источник


Ответы (1)


Скриптовые функтоиды могут только принимать строки и возвращать строки. Вам придется делать то, что вы пытаетесь сделать, в оркестровке или вспомогательной библиотеке или использовать встроенный XSLT (который может выбрать набор узлов и создать вывод на его основе).

В оркестровке я бы сделал что-то подобное в форме MessageAssignment:

msg_NewMsg = new System.Xml.XmlDocument();
UtilityClass.Map(msg_OldMsg, msg_NewMsg);
msg_MapOutput.FieldToAssign = msg_NewMsg.OuterXml();

Где FieldToAssign — это выделенное поле в сообщении. В классе утилит вы бы сделали что-то вроде этого:

public static void Map(XLANGMessage from, XLANGMessage to)
{
  using(MemoryStream ms = from[0].RetreiveAs(typeof(Stream)))
  {
    using (StreamReader reader = new StreamReader(ms))
    {
      string x = reader.ReadToEnd();
      // do stuff with x; alternative,  XDocument xd = XDocument.Parse(reader.ReadToEnd());
    }
  }
  to[0].LoadFrom(new StringReader(x));
  // alt: save the XDocument to a memory stream and call LoadFrom on the memory stream
}
person Dan Field    schedule 27.02.2015
comment
Хорошо, как из оркестровки я могу запустить это и вернуть что-то, что я могу внедрить в сообщение? - person Brian Mains; 27.02.2015
comment
Я вижу, что вы говорите из вашего примера сейчас, это имеет смысл. Итак, код преобразования (ваш первый код) можно вызывать из выражения, верно? Должен ли я хранить целевое сообщение в переменной или я могу сделать это в конструктивном блоке? - person Brian Mains; 27.02.2015
comment
Это должно быть в форме назначения сообщения - вы создаете новое сообщение. Помещение его в выражение вызовет исключение. msg_NewMsg, msg_OldMsg и msg_MapOutput предназначены для сообщений, а не переменных (даже если они выглядят как переменные). - person Dan Field; 27.02.2015