メッセージが構築されると、メッセージの表現は MessageBox データベース内にあり、別の表現はコンピューター上のメモリ内にあります。 メッセージ参照を .NET オブジェクトまたは外部アセンブリに渡してメッセージを割り当て、.NET オブジェクトまたは外部アセンブリがコンピューター上のメモリ内の表現を変更する場合、BizTalk オーケストレーション エンジンは変更を認識しません。
さらに、オーケストレーション エンジンは、MessageBox データベース内の表現にあるメッセージ パーツ データを無効にしません。 メッセージ 部分データには、次の表現モードがあります。
XmlDocument の表現
オブジェクト表現
ストリーム表現
アンダーライングパートの表現
メッセージ 部分データをメモリ内でどのように表すかは、メッセージの構築方法と、型が .NET クラスか XML スキーマ定義言語 (XSD) スキーマかによって異なります。 ただし、UnderlyingPart 表現は常に、MessageBox データベースを指すストリームです。 メッセージが MessageBox データベースにコミットされた後、BizTalk Server のメッセージは不変であるため、オーケストレーション エンジンはメッセージ ボックス データベースの表現を使用してメッセージ パーツ データを参照します。
注
既にコミットされているメッセージからパーツを割り当てる場合、構築されたメッセージは MessageBox データベースに既に表現されている可能性があります。
たとえば、次のコードは、MessageBox データベースの表現から UnderlyingPart データを送信します。
// In this example, assume m1 is committed to the MessageBox
Construct m2 {
m2 = m1; // m2’s part data representation is the UnderlyingPart data of m1
m2(myContextProperty) = “123”; // m2’s part data representation is still the UnderlyingPart data of m1
A.test(m2.part); // orchestration engine does not invalidate the UnderlyingPart MessageBox representation
}
Send(p.o, m2);
上記のユーザー コードを使用する代わりに、次のようなコードを使用して、XmlDocument ドキュメントを Message XLANG 変数に返すことができます。
Void A.test(ref XmlDocument xd) {…}
XmlDocument B.test(XmlDocument xd) {…}
construct m2 {
m2 = m1;
m2(myContextProperty) = “123”; // m2’s part data representation is the UnderlyingPart data of m1
A.test(ref m2.part); // orchestration engine has enough information to know it has to invalidate the UnderlyingPart MessageBox representation
// or
m2.part = B.test(m2.part); // orchestration engine has enough information to know it has to invalidate the UnderlyingPart MessageBox representation
}