Pages

lundi 17 juin 2013

XML Message Debatching in Biztalk (Use a Helper DLL and Xpath Looping) : Part 1


Bonjour ,

que pensez vous si on essais de Splitter un Message Biztalk  en plusieurs Sous-Messages ?

il y  a beaucoup  de Méthodes différentes a c'elles si  :) (Normale)  .

le but de ce tutoriel est faire en sorte de manipuler le Message Biztalk  dans une orchestration  et on utilisant une DLL (Helper Class Library).

le Tutorial sera repartie en 3 partie :


  • Part 1  :  création de notre DLL Helper qui permet de manipuler le message a splitter .
  • Part 2  : Création du projet Biztalk est l'orchestration qui Splittera le Message .


Let's Gooooooooooooooooooooo....

Part 1: XML Message Debatching in Biztalk : Création de la DLL ,Helper  

Objectifs :
  • splitter un Message XML  en n Sous-Messages XML
voici un exemple de message Xml en Imput : 



<Books>
    <Book Id="1" Title="El Coran" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0" />
    <Book Id="2" Title="El Sunna El Nabawiya" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="3" Title="L'histoire du prophète mohamed" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="4" Title="l'histoire du prophète adam" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="5" Title="Apprendre Biztalk en 5 jours" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="6" Title="Comment devenir un expert Microsoft" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="7" Title="Biztalk MCTS Guide" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="8" Title="Biztalk pour les nuls" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="9" Title="Asp.net  pour les nuls" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="10" Title="L'histoire du prophète Jésus" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
</Books>

Ps: la version du framework serait 2.0 sans utilisation du Linq, on utilisera que XmlDocument .
cette version et compatible avec la version de Biztalk Server 2006  sans problème .


notre Class comportera 2 methodes  static :
  • public  static List Split(XmlDocument OrignBooks, int NbrMAx)
    
    
  • private static XmlDocument  GetBooks(int PosStart, int PosEnd, XmlDocument OrignBooks)
voila le Méthode qui fait le Split :


public  static List<XmlDocument>  Split(XmlDocument OrignBooks, int NbrMAx)
        {
            List<XmlDocument> OutListBooks = new List<XmlDocument>();

            int BookCount = OrignBooks.SelectSingleNode("Books").ChildNodes.Count;

            int steps = BookCount / NbrMAx;
            int Pos = 0;


            if (BookCount < NbrMAx)
                steps = 1;

            if (BookCount - ((NbrMAx - 1) * steps) >= NbrMAx)
                steps++;

            for (int i = 0; i < NbrMAx - 1; i++)
            {
                XmlDocument Part = GetBooks(Pos, Pos + steps, OrignBooks);
                if (Part != null)
                    OutListBooks.Add(Part);
                Pos += steps;
            }

            XmlDocument Last = GetBooks(Pos, BookCount, OrignBooks);

            if (Last != null)
            {
                OutListBooks.Add(Last);
            }

            return   OutListBooks;
        }




voila la Méthode qui retourne une partie du Message XML selon la position de début et de fin.



 private static XmlDocument  GetBooks(int PosStart, int PosEnd, XmlDocument OrignBooks)
        {


            XmlDocument newBooks = new XmlDocument();
            XmlElement root = newBooks.CreateElement("Books");
            newBooks.AppendChild(root);
            XmlNodeList NLBook = null;

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(OrignBooks.NameTable);
            nsmgr.AddNamespace("btns", "http://www.barigo.co/Blog/Bizalk/Split/2013-1.0");

            string query = String.Format("//Books/btns:Book[position() > {0} and position() <= {1}]", PosStart, PosEnd);

            NLBook = OrignBooks.SelectNodes(query, nsmgr);

            if (NLBook.Count > 0)
            {
                XmlNode targetNode = null;
                foreach (XmlNode c in NLBook)
                {
                    targetNode = newBooks.ImportNode(c, true);
                    root.AppendChild(targetNode);
                }


                return newBooks;
            }

            return null;

        }


voici les étapes a suivre pour créer votre projet de Class Libray en C# avec Visual Studio:




Etape 1: Démarrer Microsoft Visual Studio 

Etape  2: dans le Menu Bar, appuyez sur Fichier -> Nouveau Projet Project... 

Etape 3: dans la liste a gauche , appuyez sur  Windows au dessous de Visual C#.

Etape  4: dans la liste a droite , appuyez sur ClassLibrary /bibliothèque de Class

Etape 5: Changer le Nom  et tapez SplitHelper et appuyez  sur  OK  

Etape 6: puis OK.


Lorsque vous cliquez sur OK, Visual Studio va créer un espace de noms avec le nom que vous venez d'utiliser.

ajouter les deux méthodes au dessus  (Split et GetBooks) a votre Code , puis faire un Build en Mode Release pour optimiser les performances.

en ce moment vous disposer de votre Class Helper Qui permet de faire le Split de votre Message(Books) en  n Sous-Message .

exemple :

si on appel la méthode split avec un Nbr=3.

vous aurez 3 fichiers splitter  comme suite :

Fichier XML 1:


<Books>
    <Book Id="1" Title="El Coran" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0" />
    <Book Id="2" Title="El Sunna El Nabawiya" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="3" Title="L'histoire du prophète mohamed" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
</Books>

Fichier XML 2: 
<Books>
    <Book Id="4" Title="l'histoire du prophète adam" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="5" Title="Apprendre Biztalk en 5 jours" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="6" Title="Comment devenir un expert Microsoft" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
</Books>

Fichier XML 3:
 
<Books>
    <Book Id="7" Title="Biztalk MCTS Guide" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="8" Title="Biztalk pour les nuls" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="9" Title="Asp.net  pour les nuls" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
    <Book Id="10" Title="L'histoire du prophète Jésus" xmlns="http://www.barigo.co/Blog/Bizalk/Split/2013-1.0"  />
</Books>


j'ai expert donné un exemple de Fichier XML avec Namespace (très important)  , car si vous n'avez pas de Namespace dans votre noeud XML , par défaut vous pouvez ignorer ces deux lignes :

 XmlNamespaceManager nsmgr = new XmlNamespaceManager(OrignBooks.NameTable);
            nsmgr.AddNamespace("btns", "http://www.barigo.co/Blog/Bizalk/Split/2013-1.0");

Dans l'attente de vos commentaires :) ...

a Suivre dans la deuxiéme partie du Tutorial  ....

NEXT : Part 2: XML Message Debatching in Biztalk : Création de l'orchestration qui fait le Splitte .


Read More


vendredi 14 juin 2013

Comparison of business integration software




if you need to choose the best Business Integration Platform, I recommend you this link, it will give you a clear idea about the various existing solutions on the IT market.

PS: dont forget to choose Biztalk :)  ,you'll not regret
Read More


mercredi 6 mars 2013

Retrieving Metadata for SAP Operations in Visual Studio


Hello, 

pour ceux qui veulent faire des interfaçages  du SAP et Biztalk Server , voila un lien très utiles .

a la prochaine  pour un Tutorial simple et rapide ;) .
Read More


XML to XSD - Comment générer un schéma XSD a partir d'un fichier XML?


Re-Bonjour ,

savez vous que les fichiers XML jouent un rôle essentiel dans toutes les applications.  :)

tous les fichiers XML se base sur  schéma et avant de générer un schéma il faut prendre des précautions supplémentaires pour éviter les problème majeurs dans vos applications.

Hé  Oui, j'ai fait face à des situations où  j'avais que des fichiers d'entrée et des fichiers de sortie, mais j'avais besoin du schéma pour valider mon parse de fichiers!!!!

je pense que vous êtes comme moi :) , des paresseux , pour créer un schéma manuellement car il faut énormément de temps  et il y a aussi des possibilités de faire des erreurs.


voila un exemple de fichier :


pour générer votre schéma  ,ouvrer votre invité de commande Visual studio (autant qu'administrateur) : 




puis taper la commande suivante :  
xsd votrefichier.xml 

c'est fini :) votre schéma a bien était crée dans le répertoire de base de l'installation Visual studio.

vous aurez quelque chose comme ça  :


pour plus de flexibilité de la commande xsd.exe  , veuillez vous référer a ce lien 
Read More


mardi 5 mars 2013

Comment Calculer Votre Age en C# ?(différence entre deux dates)

Bonjour ,

a chaque fois qu'on me demande tu a quel age!! je réponds je ne sais pas exactement :) .

c'est la vérité , pour donner votre age exacte il faut faire trop de calcule :( . donc mieux dire que je ne sais pas exactement lol .

passons au chose sérieuses , chaque développeur un jour ou un autre ,il aura besoin de faire des calcules entre deux dates , pour récupérer le nombre de jours ,le nombre de mois et le nombre d'années.

je suis la pour vous faciliter la vie avec un simple Copie-Coller :) !!!!!




j'ai choisie le cas de calcule d'age ,pour bien comprendre le code, mais vous pouvez changer la signature comme vous voulez , par exemple enlever le deuxième date (now) et la remplacer a l'intérieur de le méthode avec un DateTime.Now :) .

la méthode est une parmies beaucoup d'autres .

juste avant de faire appel a cette méthodes , veuillez passer les dates en respectons de la plus récente a la plus ancienne et gérer les exception :).

Télécharger le Code

n'oubliez pas de laisser vos commentaire et partager avec vos amis :) .


Read More


lundi 4 mars 2013

Biztalk : Comment Changer le NameSpace d'un Message Xml a partir d'un Custom Receive Pipeline

Comment développer des Composants de  Custom Pipelines

Hé oui la partie dont chaque développeur  adore  J .
Avant de commencer ce petit tutorial, voici quelques fonctionnalités des Pipelines.
On distingue deux types de Pipelines : 
·         Pipelines de réception
·         Pipelines  d’envoi
Les Custom Pipelines sont utilisés pour réaliser une série d'opérations de traitement sur ​​les messages et aussi procéder a des traitement spécifique et complexe, par exemple :
·         Crypter et décrypter des messages
·         Signature des Message (numériquement parlons)
·         split d’un message en plusieurs
·         changement des propriétés de message (élément promus, entête ou pied de message)
·         etc .
  En résumé avec des customs Pipelines le traitement des messages devient EASY !!!
Cours théorique pour ceux qui aime les définitions J

Chaque  Pipelines contient des étapes et chaque étape peut détenir plusieurs composants de pipelines.


                                                                             
Il existe plusieurs catégories de composants de pipeline chacun fait un  travail spécifique lorsqu'il est  employés dans les étapes prédéfinies. Ces categories sont :

Composant
Etapes
Rôles
General

Decode, Encode, Pre-assemble, Resolve Party or Validate
Prendre un message de processus et de produire un ou pas de  message.
Disassemble
Disassemble
Splitter ou ventiler  un message et promouvoir les propriétés personnalisées.
Assemble
Assemble
Utilisé pour envelopper un message avec une en-tête.

allons y pour du code !!!!! .

Je vais créer un exemple de composant de pipeline général(General Component). Le scénario est très simple. Chaque fois que je reçois un message, je veux changer dans le message dans l'espace de noms

voici a quoi ressemble le message en entrée :
<Input xmlns="http://MonEspaceDeNomAchanger">
                <Nom>BARIGO</Nom>
<Prenom>Amine</Prenom>
  </Input> 

voici le résultat que je veux obtenir après modification : 

<Input xmlns="http://EspaceDeNomModifie">
                <Nom>BARIGO</Nom>
<Prenom>Amine</Prenom>
  </Input> 

let Start Working :)  :

Étapes : 
  1. Télécharger le Wizard des Custom Pipeline 
  2. après l'installation du wizard ,vous allez trouver une icone  avec les type de projet Biztalk :
  

création du pipeline apartir du wizard : 
  • choisissez le projet Biztalk Server Pipline Component 
  •  tapez le nom du projet (la routine habituelle :) )
  • puis remplissez les informations suivante 
    • nom du Composant
    • Version
    • la description

  • puis choisir la variable(s) que le Pipelines va utiliser (dans notre cas pas de variable utilisé ).

  • puis finish .

 

  • après avoir fini de remplir les informations pour votre Pipelines , il faut aller fouiller un peux dans le code , chercher une méthode Execute  
public Microsoft.Biztalk.Message.Interop.IBaseMessage   
               Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc,                                                                                                                   
               Microsoft.BizTalk.Message.Interop.IBaseMessage pInMsg)

               {

                   // 

                  // TODO: implement component logic
                  // 
                  // this way, it's a passthrough pipeline component

Stream originalStream = pInMsg.BodyPart.GetOriginalDataStream();
if (originalStream != null)
{
 
XmlDocument xdoc = new XmlDocument();
xdoc.Load(originalStream);
//l'appel  a cette methode procéde au changement de l'espace de Nom du Messaage
xdoc=ChangerEspaceDeNom(xdoc,"EspaceDeNomModifie");
pInMsg.BodyPart.Data = new MemoryStream();
xdoc.Save(pInMsg.BodyPart.Data);     
pInMsg.BodyPart.Data.Position = 0;
}
                     return pInMsg;
               }

  • dans cette méthode on va mettre le code qui va vous servir a changer l'espace de Nom de votre message .(allezzzzzzzzzzzzz restez concentré ).
  •  ajouter la nouvelle méthode  ChangerEspaceDeNom (il y a plusieurs methode pour modifier le NameSpace du message ).
public static System.Xml.XmlDocument ChangerEspaceDeNom(System.Xml.XmlDocument oldDoc, string EspaceDeNom)
        {

            try
            {
                oldDoc.DocumentElement.RemoveAllAttributes();
                oldDoc.DocumentElement.SetAttribute("xmlns", EspaceDeNom);
                System.Xml.XmlDocument newDoc = new System.Xml.XmlDocument();
                newDoc.LoadXml(oldDoc.OuterXml);
                return newDoc;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }

  • après avoir  fini la partie du code, je vous invite a compiler votre solutions et générer votre DLL qui va nous servir comme référence dans votre projet Biztalk (n'oublier pas de signer la DLL).
Comment Utiliser le Custom Pipeline dans le projet Biztalk :
  • dans votre solutions Biztalk ajouter un nouveau élément :  Receive Pipeline

  • puis ajouter la référence a votre projet et dans la barre d'outils glisser votre composant dans l'etape decode :


  • Builder votre projet ,puis deployer la solutions et testez :).

j’espère que ce quick tutorial vous a donner une idée sur comment créer un Custom Receive Pipeline qui permet de Changer le Namespace d'un Message Xml.


Read More


mardi 29 janvier 2013

Biztalk : Comment Lister les Send Port arrêtés


Bonjour,

Ce petit Post vous donne une maniéré rapide pour attaquer la base de données BizTalkMgmtDb directement pour lister les Send Ports arrêtés .



SELECT
    RL.Name AS ReceiveLocationName
    , RL.InboundTransportURL AS InboundTransportURL
    , RP.nvcName AS ReceivePortName
FROM BizTalkMgmtDb.dbo.adm_ReceiveLocation AS RL WITH(READPAST, ROWLOCK)
    INNER JOIN BizTalkMgmtDb.dbo.bts_receiveport AS RP WITH(READPAST, ROWLOCK)
        ON RL.ReceivePortId = RP.nID
    INNER JOIN BizTalkMgmtDb.dbo.bts_application AS APP WITH(READPAST, ROWLOCK)
        ON RP.nApplicationID = APP.nID
WHERE
    APP.nvcName = '?'
    AND RL.[Disabled] = -1
    AND RL.Name NOT LIKE '%Disabled%'




Read More


Biztalk : Comment Lister les Receive Locations arrêtés

Bonjour,

Ce petit Post vous donne une maniéré rapide pour attaquer la base de données BizTalkMgmtDb directement pour lister les Receive Locations arrêtés .


SELECT
    SPTP.nvcAddress AS SendingURI
    , SP.nvcName AS SendPortName
FROM
    BizTalkMgmtDb.dbo.bts_sendport_transport AS SPTP WITH(READPAST, ROWLOCK)
    INNER JOIN BizTalkMgmtDb.dbo.bts_sendport AS SP WITH(READPAST, ROWLOCK)
        ON SPTP.nSendPortID = SP.nID
    INNER JOIN BizTalkMgmtDb.dbo.bts_application AS APP WITH(READPAST, ROWLOCK)
        ON SP.nApplicationID = APP.nID
WHERE
    APP.nvcName = '?'
    AND SP.nPortStatus <> 3
    AND SP.nvcName NOT LIKE '%unenlisted%'
    AND SPTP.nTransportTypeId IS NOT NULL

Download Sql File


Read More


Biztalk :Comment récupérer les Receive/Send ports informations depuis la base BizTalkMgmtDb

Bonjour ,
sans doute vous serez face a la situation ou vous avez beaucoup  Send/Receive Ports dans votre Application ,est vous avez besoin de récupérer ces informations rapidement .

ce petit Post vous donne une maniéré rapide pour attaquer la base de données BizTalkMgmtDb directement.

NB:  les requêtes ne sont pas optimisées , je vous laisse le choix de les mouler comme vous le souhaiter :)



  • Receive Ports Informations : 
SELECT DISTINCT 
                      adm_Host.Name AS Host, adm_Adapter.Name AS transporttype, bts_receiveport.nvcName AS [Receive port name], 
                      adm_ReceiveLocation.Name AS [Receive Location]
FROM         bts_receiveport INNER JOIN
                      adm_ReceiveLocation ON bts_receiveport.nID = adm_ReceiveLocation.ReceivePortId INNER JOIN
                      adm_Adapter INNER JOIN
                      adm_ReceiveHandler ON adm_Adapter.Id = adm_ReceiveHandler.AdapterId INNER JOIN
                      adm_Host ON adm_ReceiveHandler.HostId = adm_Host.Id ON adm_ReceiveLocation.AdapterId = adm_Adapter.Id AND 
                      adm_ReceiveLocation.ReceiveHandlerId = adm_ReceiveHandler.Id

  • Sends Port Informations : 

SELECT DISTINCT adm_Host.Name AS Host, adm_Adapter.Name AS transporttype, bts_sendport.nvcName AS [Send Port], bts_sendport_transport.nvcAddress AS Adresse
FROM         adm_Adapter INNER JOIN
             adm_SendHandler ON adm_Adapter.Id = adm_SendHandler.AdapterId INNER JOIN
             bts_sendport INNER JOIN
            bts_sendport_transport ON bts_sendport.nID = bts_sendport_transport.nSendPortID ON adm_Adapter.Id = bts_sendport_transport.nTransportTypeId AND 
            adm_SendHandler.Id = bts_sendport_transport.nSendHandlerID INNER JOIN
            adm_Host ON adm_SendHandler.HostId = adm_Host.Id
 


Read More