オーケストレーションから正規メッセージ(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 Toolkitを使用できる場合、理想的なアプローチは旅程を使用することです(Richard Seroterがそのアプローチに関する優れた記事をここに掲載しています)。それが選択肢ではない場合、これは私が過去に使用したアプローチです:
http://blogs.msdn.com/b/chrisromp/archive/2008/08/06/stacking-maps-in-biztalk-server.aspx