2011-07-07 110 views
0

上我都迫切需要发送一个规范消息(M1)进行业务流程和需要规范的信息映射到另一个消息(M2)。生成的消息(M2)在发送到Web服务之前必须包裹在另一个请求消息(M3)中。应用两个变换内容的消息发送端口

我无法执行的业务流程中的初始转换,我只能用规范的模式处理内部。

请告诉我达到这个阶段2变换编排之外的最佳方式?

在此先感谢!

回答

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避免藏在心里在内存中)

+0

嗨ckarras,我会给这个镜头。我怀疑邮件的大小可能会增长很多,但我会研究可能的限制是什么。只要你能提供流媒体的例子就会很棒!非常感谢! - –

+0

Microsoft已经提供了一个管道组件作为ESB Toolkit样本的一部分,它允许您在管道内执行映射。见http://msdn.microsoft.com/en-us/library/ff699836.aspx – schellack

+0

@schellack我尝试了ESB指导管道(在第一个版本),它被装载在内存中的整个结果尽管它使用流式传输(内部)。所以当我遇到更大的消息时,我不得不开发一种替代方案。我不确定这是否已在ESB Toolkit v2中得到解决。 – ckarras

0

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

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

+0

嗨克里斯的答复表示感谢。我已经看到了你的解决方案,正如你所建议的那样,它可以作为一个临时解决方案。我想我想知道这是否是一个“正确”的方式来实现这一点 - 这更接近卡卡拉斯的建议。再次感谢! –

相关问题