2011-07-07 102 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

嗨克里斯的答覆表示感謝。我已經看到了你的解決方案,正如你所建議的那樣,它可以作爲一個臨時解決方案。我想我想知道這是否是一個「正確」的方式來實現這一點 - 這更接近卡卡拉斯的建議。再次感謝! –

相關問題