사용자 코드의 메시지 참조
메시지를 생성하면 메시지의 한 표시는 MessageBox 데이터베이스에 있고 다른 표시는 컴퓨터의 메모리에 있습니다. 메시지 참조를 .NET 개체나 외부 어셈블리로 전달하여 메시지를 할당한 다음 .NET 개체나 외부 어셈블리가 컴퓨터의 메모리에 있는 표시를 수정하면 BizTalk 오케스트레이션 엔진은 수정 사항을 인식하지 못합니다.
또한 오케스트레이션 엔진은 MessageBox 데이터베이스의 표시에 있는 메시지 파트 데이터를 무효화하지 않습니다. 메시지 파트 데이터에는 다음 표시 모드가 있습니다.
XmlDocument 표시
Object 표시
Stream 표시
UnderlyingPart 표시
메시지 파트 데이터가 메모리에 표시되는 방식은 메시지 생성에 따라 달라지며 해당 유형이 .NET 클래스인지 또는 XSD(XML 스키마 정의) 언어 스키마인지에 따라 달라집니다. 그러나 UnderlyingPart 표시는 항상 MessageBox 데이터베이스로 향하는 스트림입니다. 메시지가 MessageBox 데이터베이스로 커밋된 후 BizTalk Server의 메시지는 변경할 수 없기 때문에 오케스트레이션 엔진은 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 문서를 메시지 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
}