La première question qui vient à l'esprit est comment parcourir les parts du message d'entrée sachant qu'on ne connaît à l'avance ni leur nombre ni leur nom. Si on inspecte le code généré avec
reflector on note qu'un message multi-part est un message
XLANG qui implémente l'interface
IEnumerable et qui offre des indexeurs pour accéder aux parts par leur nom ou index :
Pour accéder aux méthodes de cette interface il faut convertir notre message vers sa classe de base (sous le designer de BizTalk les méthodes héritées ne sont visibles qu'au niveau de la classe qui les implémente, dans notre cas
XLANGMessage). Pour cela nous allons créer une variable de type
XLANGMessage :
Au niveau de l'orchestration nous allons ajouter un composant de type
Set variables et faire les affectations suivantes :
InputBaseMessage = InputMessage;Index = 0;Ensuite il faut ajouter un composant de type
loop pour parcourir les parts grâce à l'expression suivante :
Index < InputBaseMessage.CountMaintenant il nous reste à récupérer chaque part et à la traiter.
Une part est de type
Microsoft.XLANGs.BaseTypes.XLANGPart, il faut donc céer une variable de ce genre pour acceuillir la part courante :
Part = (Microsoft.XLANGs.BaseTypes.XLANGPart)InputBaseMessage[Index];Le nom du schema associé à la part est contenu dans la propriété
PipelineComponentTester.DecomposerPartProperty car c'est à cet emplacement que le
désassembleur a stocké cette information. Pour cela on ajoute un composant
Set variables nommé
Get part sur le designer avec le code suivant :
PartSchemaName = (System.String)(Part.GetPartProperty(typeof(PipelineComponentTester.DecomposerPartProperty)));L'orchestration ressemble maintenant à ceci :
Pour décider quelle sous-orchestration appeler nous allons ajouter un composant
Decide qui fait un switch sur le nom du XSD retourné par la part. Dans notre cas elle se déclenche si la condition
PartSchemaName == "SchemasContainer.City" est vraie :
Nous allons maintenant créer une orchestration fille qui est spécialisée dans le traitement d'un message compatible avec le XSD
City :
<?xml version="1.0" encoding="utf-16" ?>
- <xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003"
xmlns="http://www.thb.com/schemas/0"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://www.thb.com/schemas/0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Ville" type="xs:string" />
</xs:schema>