用户代码中的消息引用
构造消息时,消息的表示形式位于 MessageBox 数据库中,另一个表示形式位于计算机上的内存中。 如果通过将消息引用传递给 .NET 对象或外部程序集进行消息分配,然后 .NET 对象或外部程序集修改计算机上的内存中的表示形式,则 BizTalk 业务流程引擎不知道修改。
此外,业务流程引擎不会使 MessageBox 数据库中表示形式的消息部分数据失效。 消息部分数据具有以下表示模式:
XmlDocument 表示形式
对象表示形式
流表示形式
UnderlyingPart 表示形式
消息部分数据在内存中的表示方式取决于消息构造以及类型是 .NET 类还是 XML 架构定义语言 (XSD) 架构。 但是,UnderlyingPart 表示形式始终是指向 MessageBox 数据库的流。 由于BizTalk Server中的消息在将消息提交到 MessageBox 数据库后是不可变的,因此业务流程引擎使用 MessageBox 数据库中的 表示形式来引用消息部分数据。
注意
如果从已提交的消息中分配部分,构造的消息可能已在 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
}