我迫切需要从编排中发送规范消息 (M1),并且需要将规范消息映射到另一条消息 (M2)。生成的消息 (M2) 在发送到 Web 服务之前必须包装在另一个请求消息 (M3) 中。
我无法在编排中执行初始转换,因为我只能在内部处理规范模式。
在编排之外实现此 2 阶段转换的最佳方法是什么?
提前致谢!
我迫切需要从编排中发送规范消息 (M1),并且需要将规范消息映射到另一条消息 (M2)。生成的消息 (M2) 在发送到 Web 服务之前必须包装在另一个请求消息 (M3) 中。
我无法在编排中执行初始转换,因为我只能在内部处理规范模式。
在编排之外实现此 2 阶段转换的最佳方法是什么?
提前致谢!
您可以制作一个按顺序应用每个地图的管道组件。然后将端口配置为使用带有此组件的管道。
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 工具包,理想的方法是使用行程(Richard Seroter 在此处有一篇关于该方法的好文章)。如果这不是一个选项,这是我过去使用的一种方法:
http://blogs.msdn.com/b/chrisromp/archive/2008/08/06/stacking-maps-in-biztalk-server.aspx