Nachrichtenverweise in Benutzercode
Wenn eine Nachricht erstellt wird, befindet sich eine Darstellung dieser Nachricht in der MessageBox-Datenbank und eine weitere im Arbeitsspeicher des Computers. Wenn Sie die Nachrichtenzuweisung durchführen, indem Sie einen Nachrichtenverweis an ein .NET-Objekt oder eine externe Assembly übergeben, und die Darstellung im Arbeitsspeicher des Computers von diesem .NET-Objekt bzw. der externen Assembly geändert wird, stehen der BizTalk-Orchestrierungs-Engine keine Informationen über diese Änderung zur Verfügung.
Zudem werden die Nachrichtenteildaten der Darstellung in der MessageBox-Datenbank von der Orchestrierungs-Engine nicht für ungültig erklärt. Nachrichtenteildaten verfügen über folgende Darstellungsmodi:
XmlDocument-Darstellung
Objekt-Darstellung
Stream-Darstellung
UnderlyingPart-Darstellung
Die Darstellung von Nachrichtenteildaten im Arbeitsspeicher ist von der Nachrichtenerstellung und vom Typ abhängig, bei dem es sich um eine .NET-Klasse oder ein XSD-Schema handelt. Die UnderlyingPart-Darstellung ist jedoch immer ein Stream in Richtung der MessageBox-Datenbank. Da Nachrichten nach der Übergabe an die MessageBox-Datenbank im BizTalk Server unveränderlich sind, wird die Darstellung in der MessageBox-Datenbank von der Orchestrierungs-Engine als Verweis auf Nachrichtenteildaten verwendet.
Hinweis
Wenn Sie Teile einer bereits übergebenen Nachricht zuweisen, ist möglicherweise bereits eine Darstellung der erstellten Nachricht in der MessageBox-Datenbank vorhanden.
Der folgende Code sendet beispielsweise die UnderlyingPart-Daten aus der Darstellung in der MessageBox-Datenbank:
// 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);
Anstelle des oben beschriebenen Benutzercodes können Sie auch Code ähnlich dem folgenden verwenden, um ein XmlDocument-Dokument an eine XLANG-Variable einer Nachricht zurückzugeben:
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
}