Messages représentés en tant que XLANGMessage
Un objet XLANGMessage représente un message instance déclaré avec un service XLANG. Cet objet est obtenu en transmettant une référence à un message en tant que paramètre dans un appel de méthode. Un objet XLANGPart représente une partie de message contenue dans un message instance au sein d’un service XLANG. Cet objet est obtenu soit en passant une référence de composant dans un appel de méthode où le type de paramètre de réception est XLANGPart , soit en énumérant sur une référence passée de XLANGMessage.
Une variable de message d’orchestration peut être passée à un composant utilisateur et reçue en tant qu’objet XLANGMessage . L’objet XLANGMessage permet d’accéder aux composants et d’accéder aux propriétés de message. L’utilisateur peut « s’accrocher » à un XLANGMessage et ainsi prolonger sa durée de vie au-delà de l’étendue déclarée. Par la suite, un XLANGMessage peut être retourné à partir d’une méthode et affecté à une variable de message dans une orchestration.
Construction d'un XLANGMessage
Lors de la construction d’un XLANGMessage avec un flux, le type de flux doit implémenter IStreamFactory ou être un MemoryStream. L’exemple de code suivant montre comment construire un XLANGMessage :
public class FileStreamFactory : IStreamFactory
{
string _fname;
public FileStreamFactory(string fname)
{
_fname = fname;
}
public Stream CreateStream()
{
return new FileStream
(
_fname,
FileMode.Open,
FileAccess.Read,
FileShare.Read
);
}
}
public static void AssignStreamFactoryToPart(XLANGMessage msg)
{
IStreamFactory sf = new FileStreamFactory( @”c:\data.xml” );
msg[0].LoadFrom( sf );
}
Il peut arriver que vous souhaitiez créer un nouveau message sans transformer un message source. Pour ce faire, utilisez une variable de type System.Xml. XmlDocument et chargement ou construction du contenu approprié. Dans l’exemple suivant, XML est chargé à partir d’une chaîne à l’aide de la méthode LoadXml de XmlDocument :
XmlVariable.LoadXml("<ns0:Root PONumber="047745351122111" xmlns:ns0="http://BTSHTTPSend.SimpleSchema"><MyChildRecord SubAttr1="Simple Attribute " /></ns0:Root>");
XLANGMessage XmlMsg = XmlVariable;
L’exemple suivant charge du code XML à partir d’un fichier à l’aide de la méthode Load de XmlDocument :
XmlVariable.Load("C:\MyData.xml");
XLANGMessage XmlMsg = XmlVariable;
Notes
Si vous souhaitez construire des messages plus volumineux, utilisez l’une des méthodes de diffusion en continu présentées dans la section précédente ou envisagez d’utiliser la forme Transformer dans orchestration Designer.
Considérations sur l'utilisation de XLANGMessage et XLANGPart
Lorsque vous utilisez XLANGMessage et XLANGPart dans le code utilisateur, tenez compte des éléments suivants :
Ne passez pas de partie de message en tant qu’argument XLANGPart ou retournez une valeur de type XLANGPart. Vous devez passer XLANGPart comme type de composant. Par exemple :
Message String msg; Class.Test(msg); // or you can do the following Messagetype mt { String part; }; Message mt msg; Class.Test(msg,part);
Vous pouvez également passer le message lui-même en tant que XLANGMessage et utiliser les opérateurs d’indice XLANGMessage pour accéder à la partie à l’intérieur de l’appel de fonction. Toutefois, vous ne devez pas placer un élément XLANGPart dans une collection dont la durée de vie dépasse la durée de vie de l’appel de fonction. Au lieu de cela, vous devez placer le XLANGMessage dans la collection. Par exemple :
void Test(XLANGMessage xlm) { try { XLANGPart xlp = xlm[0]; string sval = (string)xlp.RetrieveAs(typeof(string)); } finally { xlm.Dispose(); } }
Ne définissez pas de paramètre d’orchestration comme XLANGMessage ou XLANGPart. Pour transmettre un message, utilisez un paramètre de type de message. Pour transmettre une partie, transmettez le message à la place, puis utilisez la partie. Si vous souhaitez uniquement obtenir la valeur de partie, utilisez le type de partie pour transmettre la partie.
Ne retournez pas de paramètre XLANGMessage pour un appel de méthode. Si vous retournez un paramètre XLANGMessage passé et que vous ne pouvez pas appeler la méthode Dispose sur le paramètre à l’intérieur de l’appel de méthode, cela viole intuitivement les hypothèses de durée de vie et lève également une exception. Lorsque vous transmettez un message via un paramètre XLANGMessage au code utilisateur, vous référencez le message à un contexte spécial qui n’a normalement pas de messages référencés. La durée de vie de ce contexte correspond à celle de l'instance d'orchestration. Cela est dû au fait que BizTalk Server ne sait pas si le code utilisateur conservera le message.
Si une instance d'orchestration existe, les messages créés dans celle-ci ne sont plus valides, et la durée de vie d'une collection de ce type doit donc être inférieure ou égale à celle de l'instance. Toutefois, si vous souhaitez libérer une référence de message dans une boucle lorsque le message a été transmis via un argument XLANGMessage qui a la même durée de vie que l’orchestration instance, vous pouvez appeler XLANGMessage.Dispose pour libérer la référence. En outre, si à l’intérieur de la méthode de code utilisateur, le paramètre XLANGMessage est utilisé uniquement localement et que la durée de vie du paramètre est contenue dans celle de l’appel de fonction, vous pouvez également appeler XLANGMessage.Dispose pour libérer la référence au contexte racine et donner au message correspondant le comportement de durée de vie normale. Par exemple :
void Test(XLANGMessage xlm) { try { //XLANGMessage is only used locally } finally { xlm.Dispose(); } }
Si vous placez le xlm dans une collection, la classe elle-même doit avoir une méthode Dispose pour le nettoyage. Par exemple :
public class A { Hashtable h = new Hashtable(); public void Test(XLANGMessage xlm) { h[xlm] = 1; } //You can have more methods here public void Dispose() { foreach (XLANGMessage xlm in h.Keys) { xlm.Dispose(); } } }
Vous appelez A.Dispose lorsque vous avez terminé avec la collection de XLANGMessages.
Voir aussi
Messages représentés en tant que schémas XSD
Messages représentés en tant que classes .NET
Construction de messages dans le code utilisateur