Применение двух преобразований к сообщению через порт отправки - PullRequest
0 голосов
/ 08 июля 2011

Мне нужно срочно отправить каноническое сообщение (M1) из оркестровки, и мне нужно сопоставить каноническое сообщение с другим сообщением (M2). Полученное в результате сообщение (M2) должно быть упаковано в другое сообщение запроса (M3) перед отправкой его веб-службе.

Я не могу выполнить начальное преобразование в оркестровке, поскольку могу работать только с канонической схемой внутри.

Каков наилучший способ достичь этого двухэтапного преобразования вне оркестровки?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Вы можете создать компонент конвейера, который применяет каждую карту последовательно.Затем настройте порт для использования конвейера с этим компонентом.

private Stream ApplyMap(Stream originalStream, Type mapType)
{   
   var transform = TransformMetaData.For(mapType).Transform;
   var argList = TransformMetaData.For(mapType).ArgumentList;

   XmlReader input = XmlReader.Create(originalStream);
   Stream outputStream = new VirtualStream();

   using (var outputWriter = XmlWriter.Create(outputStream))
   {
      transform.Transform(new XPathDocument(input), argList, outputWriter, null);
   }
   outputStream.Flush();
   outputStream.Position = 0;

   XmlReader outputReader = XmlReader.Create(outputStream);
   return outputReader;
}

Затем в методе выполнения компонента конвейера:

Type mapType1 = Type.GetType("YourMapNamespace.Map1, YourAssemblyName,...");
Type mapType2 = Type.GetType("YourMapNamespace.Map2, YourAssemblyName,...");

Stream originalStream = inmsg.BodyPart.GetOriginalDataStream();
Stream mappedStream = 
   ApplyMap(
     ApplyMap(originalStream, mapType1),
     mapType2
   );
inmsg.BodyPart.Data = mappedStream;
context.ResourceTracker.AddResource(mappedStream);

Обратите внимание, что этот пример делает все в памяти, чтобы он мог бытьпроблема для больших сообщений.Я попытаюсь найти лучший пример, который использует потоковую передачу (или в худшем случае, вы можете использовать VirtualStream, чтобы не хранить все в памяти)

0 голосов
/ 08 июля 2011

Если вы можете использовать ESB Toolkit, идеальным подходом будет использование маршрута (Ричард Серотер имеет хорошую статью об этом подходе здесь ).Если это не вариант, вот подход, который я использовал в прошлом:

http://blogs.msdn.com/b/chrisromp/archive/2008/08/06/stacking-maps-in-biztalk-server.aspx

...