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

时间:2011-07-07 21:34:47

标签: mapping biztalk orchestration

我迫切需要从业务流程中发送规范消息(M1),并且需要将规范消息映射到另一个消息(M2)。在将结果消息(M2)发送到Web服务之前,必须将其包装在另一个请求消息(M3)中。

我无法在业务流程中执行初始转换,因为我只能在内部处理规范架构。

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

提前致谢!

2 个答案:

答案 0 :(得分:3)

您可以创建一个按顺序应用每个地图的管道组件。然后配置端口以使用具有此组件的管道。

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来避免将所有内容保留在内存中)

答案 1 :(得分:0)

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

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