用户代码中的消息引用

构造消息时,消息的表示形式位于 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  
             }