Lors du déploiement du BAM Interceptor, il est indispensable de fournir le fichier de configuration au format XML attendu par le moteur. Ce fichier de configuration embarque notamment les données à intercepter sous forme d'une requête XPath.
Comme pour la plupart des flux XML échangés, il arrive fréquemment d'avoir un namespace par défaut qui est utilisé au niveau de la structure XML. Prenons justement l'exemple du fichier XML généré pour la définition des activités BAM :
<?xml version="1.0" encoding="UTF-16"?>
<BAMDefinition xmlns="http://schemas.microsoft.com/BizTalkServer/2004/10/BAM">
<Activity Name="SaphirActivity" ID="IDC102E1EE1F3D4F91B934D19E1DE48363">
<Checkpoint Name="Creator" ID="IDAA2D2CC2EE0E414F990901940510B91A" DataType="NVARCHAR" DataLength="50"/>
</Activity>
<View Name="Inter_Createurs" ID="ID1291656AEA354E0CABDF7E6070FEB202">
<ActivityView Name="ViewSaphirActivity" ID="ID0672501E55A34BE281BA608FE960A76E" ActivityRef="IDC102E1EE1F3D4F91B934D19E1DE48363">
<Alias Name="Creator" ID="ID19FEC7FBD35D4A0482566C066C9FD8ED">
<CheckpointRef>IDAA2D2CC2EE0E414F990901940510B91A</CheckpointRef>
</Alias>
...
Dans ce cas précis, il serait donc assez logique d'envisager la requête XPath suivante pour récupérer le noeud "Checkpoint" : /BAMDefinition/Activity/Checkpoint. Malheureusement cette requête n'est pas valide et ne remonte donc aucune donnée au niveau de l'interception BAM !
Afin d'identifier le problème et par la même occasion se simplifier la vie dans la génération de requêtes XPath, un utilitaire très simple et très efficace est disponible en OpenSource :
Visual XPath. Son utilisation démontre la génération d'une requête XPath différente pour ce cas :
/def:BAMDefinition/def:Activity/def:Checkpoint. Un prefix est donc ajouté et correspond à la définition du namespace par défaut. L'utilitaire permet justement de visualiser l'ensemble des namespaces déclarés et utilisés dans un document ainsi que de valider les requêtes XPath :
Une fois la requête XPath générée et validée, il est donc nécessaire de procéder à la configuration du BAM Interceptor. Pour ce faire, il faut ajouter la requête XPath d'interception des données dans le section de configuration suivante :
<ic:Update DataItemName="CheckPoint" Type="NVARCHAR">
<ic:Expression >
<wcf:Operation Name="XPath">
<wcf:Argument>/def:BAMDefinition/def:Activity/def:Checkpoint</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
Pour que cette requête soit valide, il est important d'ajouter la définition du prefixe : /def correspondant au namespace par défaut dans la section de configuration suivante :
<wcf:NamespaceMappings >
<wcf:Namespace Prefix="def" Uri="http://schemas.microsoft.com/BizTalkServer/2004/10/BAM" />
</wcf:NamespaceMappings>
Une fois ces configurations effectuées, le BAM Interceptor est opérationnel et collecte bien les données véhiculées dans le flux.
Une autre solution, beaucoup moins conviviale, consiste à utiliser les syntaxes complètes identiques à celle utilisée dans les expressions C# des orchestrations BizTalk. La requête XPath serait donc la suivante : /*[local-name()='BAMDefinition' and namespace-uri()='http://schemas.microsoft.com/BizTalkServer/2004/10/BAM']/*[local-name()='Activity' and namespace-uri()='http://schemas.microsoft.com/BizTalkServer/2004/10/BAM']/*[local-name()='Checkpoint' and namespace-uri()='http://schemas.microsoft.com/BizTalkServer/2004/10/BAM']