Publier BizTalk 2010 sur internet avec Azure AppFabric Service Bus

by Franck Musson 31. mai 2011 23:59

La dernière version de l'EAI/BPM de Microsoft BizTalk 2010 offre une extension très interessante liée à la plateforme Cloud du même éditeur : "Windows Azure Platform".

Le Composant "BizTalk 2010 AppFabric Connect for Services" est inclus dans le version developer de BizTalk 2010.

Il est aussi possible de télécharger le "BizTalk Server Feature Pack (october 2010)"  avec sa documentation à l'adresse suivante : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f7735a19-cdb3-4f52-8e7b-c58f04c5c86a .

Les autres pré-requis sont bien évidement de disposer d'une souscription à "Windows Azure" et l'installation du "Windows Azure AppFabric SDK 1.0" : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=39856a03-1490-4283-908f-c8bf0bfad8a5 . Attention ! le SDK de Azure AppFabric V2.0 est en CTP et l'accès à Azure AppFabric 2 n'est disponible pour l'instant qu'aux béta-testeurs.

Windows Azure AppFabric

Fournit une messagerie sécurisée et de la connectivité à travers différentes topologies de réseau.

Permet aux applications hybrides de s'étendre au Cloud.

Support de différents protocoles de communication et des patterns pour les développeurs permettant de bâtir des systèmes de messaging fiables avec le nuage.

 Ci-dessous les différentes composantes de Azure AppFabric

Nous allons donc utiliser la partie "Service Bus", optionnellement le bloc "Access Control" peut lui aussi être utilisé si l'on souhaite une authentification fédérée.

Windows Azure Subscription

Vous devez avoir accès aux options "Service Bus, Access Control & Caching" afin de pouvoir créer votre propre namespace.

BizTalk 2010 AppFabric Connect for Services

AppFabric Connect for Services permets aux utilisateurs de Biztalk 2010 d'exposer leur orchestrations "On-Premise" en tant que services WCF accessibles dans le nuage. ces services pourront alors être utilisés par des clients ou partenaires sans pour autant ouvrir le firewall de l'entreprise et n'exposant aucun "Endpoint" sur internet.

Le Service Bus permets de publier des Web Services "internes" vers des clients externes dans le Cloud, l'utilisation d'un service de "Relay" servant de "Broker" de messages.

Pour une plus simple explication voir le schéma ci-dessous

Cette technique n'est bien sûr pas spécifique à BizTalk, mais à tout code .Net utilisant le SDK d'Azure AppFabric (reportez vous aux Labs présents dans le WAPTK May 2011 Refresh). à titre d'exemple je vous recommande le blog de Benjamin Guinebertière (twitter.com/benjguin), Architecte Evangéliste Microsoft, qui explique comment il a publié la plateforme d'intéropérabilité SAP (ECC 6) présente au MTC de paris (Microsoft Technology Center). ICI

Vous noterez, que le Service "On-Premise" ou l'orchestration Biztalk restent derrière le firewall, aucun port TCP entrant n'est ouvert, le service ou l'orchestration doivent juste avoir la possibilité de sortir sur internet en direct ou à travers un proxy. tout protocole basé sur TCP est supporté, UDP ne l'est pas.

AppFabric Connect for Services étend les fonctionnalités du Biztalk WCF Service Publishing Wizard pour permettre au développeur BizTalk de publier les ports de son application "On Premise" vers des clients externes à travers le Windows Azure AppFabric Service Bus (Relay Binding).

 Que fait le Wizard ?

  1. Publie un endpoint "local" WCF pour un port BizTalk
  2. Publie un endpoint "Service Bus" pour le service WCF "local"
  3. Publie un endpoint "Service Bus" pour le metadata exchange du service WCF local (les contrats publics sont disponibles sur Azure via une page RSS) - optionnel
  4. Crée les receive ports pour les orchestrations BizTalk.

Je déconseille habituellement, d'exposer un serveur BizTalk directement sur internet qui est un serveur d'intégration , recommandant de positionner un serveur web ou un serveur d'applications comme Windows AppFabric Server pour gérer au plus près les problématiques de sécurité et celles liées aux infrastructres réseau internes.

Je dois dire qu'avec ces nouvelles fonctionnalités il devient réellement possible d'exposer un BizTalk 2010 sur le Cloud.

Pour la mise en place d'une solution, je vous invite à suivre la documentation d'AppFabric Connect for Services ou il ya un Lab vraiment bien fait. il y a aussi le blog du BizTalk Server Team ICI

 

Tags: , , , ,

Biztalk | Cloud

BizTalk Server 2009 - Adapter Pack 2.0 : changer la version d’un iDoc (SAP) entrant

by srivas 2. février 2011 03:22

Ce post décrit une méthode bien pratique pour s’affranchir des problèmes liés aux changements de version des iDocs envoyés par un système SAP.

Point sur la génération des schémas

L’adapter Pack 2.0 pour BizTalk offre la possibilité de générer les schémas d’iDoc de SAP. Trois propriétés rentrent en compte lors de la génération de ces schémas, en plus du type d’iDoc choisi :

·          Le numéro de version

·          La release

·          L’extension

Rappelons que BizTalk se base sur deux éléments pour déterminer le type d’un message : le nœud racine d’une part, et le namespace d’autre part. Lors de la génération des schémas par l’Adapter Pack, ce namespace est créé en respectant cette convention :

http://Microsoft.LobServices.Sap/2007/03/Idoc/{Version}/{TypeIdoc}/{Extension}/{Release}/Receive

Par défaut, SAP génère les iDocs en fonction de la version de release courante (active). Néanmoins, il est possible d’envoyer une version d’idoc spécifique. Si, lors de la génération des schémas, l’un de ces paramètres n’a pas été choisi conformément à ce que le système SAP enverra réellement, une erreur sera remontée par BizTalk à la réception de l’iDoc, par exemple :

There was a failure executing the receive pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLReceive, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "XML disassembler" Receive Port: "WcfReceivePort_SAPBinding_IdocZHR_KPV3R710_Custom" URI: "sap://CLIENT=XXX;LANG=EN;@a/SAPSERVER/XX?ListenerGwServ=SAPGWXX&ListenerGwHost=SAPSEVER& ListenerProgramId=XXXXXX&RfcSdkTrace=False&AbapDebug=False" Reason: Finding the document specification by message type "http://Microsoft.LobServices.Sap/2007/03/Idoc/3/ZHR_KP//700/Receive#Receive" failed. Verify the schema deployed properly.

Une solution : le changement dynamique du namespace

La solution retenue dans ce post est de changer à la volée le namespace de l’iDoc entrant de manière à le faire correspondre avec celui des schémas générés dans Visual Studio. Ceci passe par la création d’un nouveau pipeline component, et la création d’un custom pipeline embarquant ce nouveau composant.

Création de la structure du Custom Pipeline Component

L’utilisation du BizTalk Server Pipeline Component Wizard simplifiera grandement cette étape. Celui-ci est téléchargeable sur CodePlex (attention à la version : 2.1 pour BTS 2009, et 2.2 pour BTS 2010) à l’adresse suivante : http://btsplcw.codeplex.com/

Une fois cet assistant installé, la création du pipeline component passe par la création d’un nouveau projet. Dans la fenêtre de création d’un projet, sélectionner le type de projets BizTalk Projects, puis sélectionner le template BizTalk Server Pipeline Component. Les étapes de l’assistant sont les suivantes :

1.     Renseigner le nom de la classe générée, le namespace de la classe, le type du pipeline (dans le cas qui nous intéresse : Receive) et le type de composant (l’étage le plus adapté ici est Decoder).

2.     Renseigner les infos générales sur le composant lui-même, à savoir son nom, sa version, sa description et l’icône qui apparaitra dans la barre des outils de Visual Studio.

3.     Créer les paramètres du futur composant :

o    IDocVersion (int)

o    IDocRelease (int)

o    IDocExtension (string)

Une fois l’assistant terminé, un nouveau projet est bien créé et comporte un fichier de classe embarquant toute la logique du composant et un fichier de ressources contenant les propriétés d’affichage du composant (nom, description et version) et son icône.

Modification des namespaces

Il faut maintenant modifier le code du composant pour y effectuer le changement dynamique du namespace des idocs entrants. Plus précisément, il va s’agir de modifier la méthode Execute (qui est un membre de l’interface IComponent).

Il s’agit dans un premier temps de récupérer le flux XML depuis le corps du message et le stocker dans un XmlDocument pour en faciliter la manipulation :

IBaseMessagePart bodyPart = inmsg.BodyPart;

 

XmlDocument originalDoc = new XmlDocument();

originalDoc.Load(bodyPart.GetOriginalDataStream());

On change ensuite les namespaces par simple manipulation et remplacement de chaînes de caractères :

string oldXmlns = originalDoc.DocumentElement.Attributes["xmlns"].Value;

string xmlns = originalDoc.DocumentElement.Attributes["xmlns"].Value.Replace(@"http://Microsoft.LobServices.Sap/2007/03/Idoc/", "").Replace(@"/Receive", "");

               

// Ne reste que "{Version}/{iDoc}/{Extension}/{Release}"

List<string> xmlnsElts = new List<string>(xmlns.Split(((string)@"/").ToCharArray()));

string version = xmlnsElts[0];

string idoc = xmlnsElts[1];

string extension = xmlnsElts[2];

string release = xmlnsElts[3];

 

string newXmlns = String.Format(@"http://Microsoft.LobServices.Sap/2007/03/Idoc/{0}/{1}/{2}/{3}/Receive",

              this.IDocVersion,

              idoc,

              this.IDocExtension,

              this.IDocRelease);

 

// Il faut égalemment changer le namespace des noeuds enfants

string oldTypeXmlns = String.Format(@"http://Microsoft.LobServices.Sap/2007/03/Types/Idoc/{0}/{1}/{2}/{3}",

              version,

              idoc,

              extension,

              release);

string newTypeXmlns = String.Format(@"http://Microsoft.LobServices.Sap/2007/03/Types/Idoc/{0}/{1}/{2}/{3}",

              this.IDocVersion,

              idoc,

              this.IDocExtension,

              this.IDocRelease);

 

StringBuilder outputMsgText = new StringBuilder();

outputMsgText.Append(String.Format("<{0} xmlns=\"{1}\">",

              originalDoc.DocumentElement.Name,

              newXmlns));

outputMsgText.Append(originalDoc.DocumentElement.InnerXml

                    .Replace(oldXmlns, newXmlns)

                    .Replace(oldTypeXmlns, newTypeXmlns));

outputMsgText.Append(String.Format("</{0}>",

           originalDoc.DocumentElement.Name));

 

On peut alors remplacer le corps du message reçu :

byte[] outBytes = System.Text.Encoding.UTF8.GetBytes(outputMsgText.ToString());

MemoryStream memStream = new MemoryStream();

memStream.Write(outBytes, 0, outBytes.Length);

memStream.Position = 0;

 

bodyPart.Data = memStream;

pc.ResourceTracker.AddResource(memStream);

 

Il ne reste alors qu’à promouvoir la propriété BTS.MessageType afin de permettre au message d’être correctement routé :

string msgType = newXmlns + "#" + originalDoc.DocumentElement.Name;

inmsg.Context.Promote("MessageType",

                      @"http://schemas.microsoft.com/BizTalk/2003/system-properties",

                  msgType);

return inmsg;

Mise en oeuvre

Une fois le composant terminé, il faut ajouter la DLL du projet correspondant dans le répertoire Pipeline Components situé dans le répertoire d’installation de BizTalk, puis l’ajouter à la Toolbox de Visual Studio.

Il est alors possible de créer un pipeline et d’y insérer le nouveau composant à l’étage Decompose. Les propriétés IDocVersion, IDocRelease et IDocExtension pourront être fixées au moment de la création du pipeline ou directement par configuration dans la console d’administration BizTalk.

Solution alternative : utilisation d’un étage de désassemblage de fichier plat

Une autre solution de contournement impliquant la création de custom pipelines et de Flat File Disassembler stages est décrite intégralement sur ce blog : Kent Weare @BlogSpot. Mais elle me parait plus longue à mettre en œuvre et surtout beaucoup moins générique.

Tags: , ,

Biztalk

Neos-SDI  Neos-SDI