对发送端口上的消息应用两个转换



我迫切需要从编排中发送规范消息(M1),并需要将规范消息映射到另一个消息(M2)。生成的消息(M2)在发送到web服务之前必须封装在另一个请求消息(M3)中。

我不能在编排中执行初始转换,因为我只能在内部处理规范模式。

在编排之外实现这两阶段转换的最佳方式是什么?

提前感谢!

您可以创建一个按顺序应用每个映射的管道组件。然后将端口配置为使用该组件的管道。

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;
}

然后在管道组件的Execute方法中:

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,以避免保持所有的内存)

如果可以使用ESB Toolkit,理想的方法是使用行程(Richard Seroter在这里有一篇关于该方法的好文章)。如果这不是一个选项,这里有一个我过去用过的方法:

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

最新更新