ユーザー コードでのメッセージ参照
メッセージが構築された時点では、メッセージ ボックス データベースとコンピューターのメモリにメッセージ表現が存在します。 メッセージ参照を .NET オブジェクトまたは外部アセンブリに渡し、この .NET オブジェクトまたは外部アセンブリでコンピューターのメモリにあるメッセージ表現を変更することによってメッセージ割り当てを行った場合、BizTalk オーケストレーション エンジンではその変更が認識されません。
また、メッセージ ボックス データベース内のメッセージ表現に含まれるメッセージ部分データは、無効になりません。 メッセージ部分データには、次のモードがあります。
XML ドキュメント表現
オブジェクト表現
ストリーム表現
UnderlyingPart 表現
メッセージ部分データがどのようにメモリ内で表現されるかは、メッセージの構築と、種類が .NET クラスと XML スキーマ定義言語 (XSD) スキーマのどちらであるかによって異なります。 ただし、UnderlyingPart 表現は常に、メッセージ ボックス データベースを指すストリームになります。 BizTalk Server のメッセージは、メッセージ ボックス データベースにコミットされた後には変更できないため、オーケストレーション エンジンではメッセージ部分データの参照にはメッセージ ボックス データベース内のメッセージ表現が使用されます。
Note
コミット済みのメッセージの各部について割り当てを行う場合、構築されたメッセージのメッセージ表現が既にメッセージ ボックス データベース内に存在する可能性があります。
たとえば、次のコードでは、メッセージ ボックス データベース内にあるメッセージ表現の 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 ドキュメントを 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
}