2011-07-07 14 views
0

標準メッセージ(M1)をオーケストレーションから送信する必要があり、標準メッセージを別のメッセージ(M2)にマッピングする必要があります。結果のメッセージ(M2)は、Webサービスに送信する前に別の要求メッセージ(M3)でラップする必要があります。送信ポートのメッセージに2つの変換を適用する

標準スキーマのみを内部的に処理できるため、オーケストレーションでは初期変換を実行できません。

オーケストレーションの外でこの2段階の変換を達成するにはどうすればよいですか?

ありがとうございます!

答えて

3

あなたは、各マップを順次適用するパイプラインコンポーネントを作ることができます。次に、このコンポーネントでパイプラインを使用するようにポートを構成します。

パイプラインコンポーネントのExecuteメソッドで次に
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; 
} 

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

こんにちはカルカス、私はこれを撃つでしょう。私は、メッセージのサイズがかなり大きくなる可能性があると思っていますが、可能な制限が何であるかを調査します。ストリーミングの例は、あなたがそれを提供できるときはいつも素晴らしいでしょう!どうもありがとう! - –

+0

マイクロソフトでは、パイプライン内でマップを実行できるように、ESBツールキットのサンプルの一部としてパイプラインコンポーネントを提供しています。 http://msdn.microsoft.com/en-us/library/ff699836.aspxを参照してください – schellack

+0

@schellack私はESBガイダンスパイプライン(最初のバージョンで)を試して、メモリ内に結果全体をロードしていました(ストリーミング内部的に)。だから私は大きなメッセージに遭遇したときに代替策を開発しなければならなかった。これがESB Toolkit v2で解決されたかどうかはわかりません。 – ckarras

0

ESBツールキットを使用することができれば理想的な方法は、旅程を使用することです(Richard Seroterはそのアプローチについての良い記事はhereです)。それはオプションではありません場合は、ここで私は過去に使用したアプローチがあります:

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

+0

こんにちはクリス、返信いただきありがとうございます。私はすでにあなたのソリューションを見ていて、提案したように、それは一時的な修正として機能するでしょう。私は、これが達成するための「正しい」方法であるかどうか疑問に思っていました。これは、ckarrasの提案に近いものでした。再度、感謝します! –

関連する問題