Riferimenti ai messaggi nel codice utente
Quando si crea un messaggio, una rappresentazione del messaggio è inclusa nel database MessageBox e un'altra rappresentazione si trova nella memoria del computer. Se si definisce l'assegnazione del messaggio passando a un oggetto .NET oppure a un assembly esterno un riferimento al messaggio, e quindi l'oggetto .NET oppure l'assembly esterno modificano la rappresentazione in memoria nel computer, il motore di orchestrazione BizTalk non rileva la modifica.
Il motore di orchestrazione, inoltre, non invalida i dati della parte del messaggio presenti nella rappresentazione nel database MessageBox. I dati della parte del messaggio possono essere rappresentati nei modi seguenti:
Rappresentazione XmlDocument
Rappresentazione oggetto
Rappresentazione flusso
Rappresentazione UnderlyingPart
Il modo in cui i dati della parte del messaggio vengono rappresentati in memoria dipende dal modo in cui è stato creato il messaggio e dal tipo, ovvero una classe .NET o uno schema XSD (XML Schema definition language). In ogni modo, la rappresentazione UnderlyingPart è sempre un flusso che punta al database MessageBox. Poiché i messaggi in BizTalk Server non sono modificabili dopo il commit del messaggio nel database MessageBox, il motore di orchestrazione utilizza la rappresentazione nel database MessageBox per fare riferimento ai dati della parte del messaggio.
Nota
Un messaggio creato può già disporre di una rappresentazione nel database MessageBox se si assegnano parti da un messaggio di cui è già stato eseguito il commit.
Ad esempio, il codice seguente invia i dati UnderlyingPart dalla rappresentazione al database MessageBox:
// 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);
Anziché utilizzare il codice utente precedente, è possibile utilizzare un codice simile al seguente per restituire un documento XmlDocument a una variabile XLANG del messaggio:
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
}