WCF et intéropabilité avec JAVA Version 1.0 Adrien RUFFIE
2 WCF et intéropabilité avec JAVA Sommaire 1 Création du service WCF... 3 1.1 Création du contrat de service... 3 1.2 Création de l implémentation du contrat de service... 4 1.3 Création de l hébergement du service... 5 2 Création du client Java... 8 3 Conclusion... 12
3 WCF et intéropabilité avec JAVA 1 Création du service WCF 1.1 Création du contrat de service Pour commencer, nous allons partir d une solution vide sous Visual Studio : Ensuite, pour créer le projet où notre contrat de service sera localisé, il suffit d aller dans : «Ajouter» puis «Nouveau Project» puis «WCF» puis «WCF Service Library». Le contrat du service est représenté en C# par une interface, ce contrat permettra à votre web service de définir les opérations/actions qu il proposera aux différents consommateurs qui pourront venir le requêter.
4 WCF et intéropabilité avec JAVA Quand Visual Studio génère votre projet, il nous suffit de supprimer la classe Service1.cs et de renommer l interface IService1.cs en IConversionService.cs pour notre exemple. Ensuite il faut supprimer le contenu de notre interface : public interface IConversionService De plus, nous allons supprimer entièrement la classe auto-générée : public class CompositeType Ensuite déclarez votre opération qui sera mise à disposition aux consommateurs du service via le contrat. Vous devriez obtenir l interface suivante : Pour finir, il faut ensuite supprimer le fichier App.config. 1.2 Création de l implémentation du contrat de service Dans notre solution, nous allons créer un nouveau projet qui sera l implémentation de votre contrat de service :
5 WCF et intéropabilité avec JAVA Après la génération automatique de votre projet, nous allons supprimer le fichier App.config ainsi que l interface IService1.cs. Renommons ensuite la classe Service1.cs en ConversionService.cs. Ajoutons la référence de notre projet ContractServiceLibrary, pour avoir accès à l interface du contrat de service. Dans la classe ConversionService.cs il ne faut pas oublier d importer l espace de noms de ContractServiceLibrary. De plus, il faut remplacer l implémentation de l interface IService1 par IConversionService. Ensuite, il faut supprimer le contenu de la classe ConversionService puis aller faire un clic droit sur «IConversionService» puis «Implémenter l interface». Une fois la méthode générée il suffit de supprimer son contenu généré par Visual Studio et d implémenter notre propre logique indiquée ci-dessous : Cette petite routine nous permet de faire une conversion entre l Euro et le dollar américain. Le montant indiqué en paramètre de la méthode en euros sera renvoyé avec une valeur en USD. 1.3 Création de l hébergement du service Pour finir, nous allons maintenant créer un troisième projet pour héberger notre service WCF :
6 WCF et intéropabilité avec JAVA Ce projet va nous permettre d héberger notre web service. En réalité, il va nous permettre de publier un endpoint où notre service sera disponible. Un endpoint represente abstraitement un point de connexion d où nous pourrons accéder au service «bindé» dessus et disponible à une adresse avec différentes possibilités de protocoles comme SOAP & http GET/POST. Après génération de ce projet, nous allons supprimer l interface IService1.cs et la classe Service1.svc.cs auto-générées. Ensuite, nous allons inclure les références de nos deux projets «ContractServiceLibrary» et «ImplementationServiceLibrary». Renommons le fichier Service1.svc en ConversionService.svc. Dans ce fichier, nous devons changer la ligne suivante : <%@ ServiceHost Language="C#" Debug="true" Service="HostingServiceApplication.Service1" CodeBehind="Service1.svc.cs" %> Pour obtenir ceci : <%@ ServiceHost Language="C#" Debug="true" Service="ImplementationServiceLibrary.ConversionService"%> Ensuite dans le fichier web.config du projet HostingServiceLibrary, il faut remplacer les occurrences de : HostingServiceApplication.Service1Behavior Par cette nouvelle valeur : ImplementationServiceLibrary.ConsersionServiceBehavior Il faut, de plus, faire de même pour l occurrence suivante : HostingServiceApplication.Service1 Remplacée par : ImplementationServiceLibrary.ConversionService Faire de même pour cette valeur : HostingServiceApplication.IService1 Remplacée par : ContractServiceLibrary.IConversionService
7 WCF et intéropabilité avec JAVA Pour finir avec le remplacement d occurences Ensuite remplacez la ligne suivante : <endpoint address="" binding="wshttpbinding" contract="contractservicelibrary.iconversionservice"> Remplacée par cette valeur : <endpoint address="" binding="basichttpbinding" contract="contractservicelibrary.iconversionservice"> Exécutons maintenant notre solution. Nous obtenons ceci : On peut constaterque le fichier de description du web service (le fichier WSDL : Web Service Description Language) est disponible à l adresse suivante : http://localhost:50855/conversionservice.svc?wsdl Nous utiliserons cette adresse pour générer le client Java.
8 WCF et intéropabilité avec JAVA 2 Création du client Java Note de l auteur : Pour cette partie j estime que le temps de développement sous Eclipse étant plus long et laborieux (et surtout rébarbatif avec les imports de jar, phase de build ect ) pour les développeurs Java non expérimentés je ferai la démonstration avec NetBeans 6.5 qui par sa maniabilité de génération de client web service est relativement simple. Après avoir lancé NetBeans allez dans le menu «Tools» puis «Plugins», il faut sélectionner l onglet «Available Plugins». Dans cet onglet, nous allons sélectionner le plugin «Web Services» et cliquer sur «Install» (si le plugin n est pas disponible, il faut mettre à jour le catalogue en cliquant sur «Reload Catalog» ou dans l onglet «Settings» en sélectionnant tous les «Update Centers». Ensuite, aller dans le menu, puis «New Project», sélectionnez «Java» dans «Categories :» de projet, puis «Java Application» dans la list «Projects :». Etape suivante : faire «Next» et pour le champ «Project Name» remplir par ConversionServiceConsume puis faire «Finish». Faire ensuite un clic droit sur notre projet puis «New» «Web Service Client»
9 WCF et intéropabilité avec JAVA Dans la fenêtre qui vient de s ouvrir, seléctionner «WSDL URL» et entrer l url où notre web service WCF à publié le WSDL: Note de l auteur (Retour d expérience) : Travaillant depuis environ deux ans dans les systèmes distribués, je vous conseille d étudier toutes les problématiques liées à l architecture où sera déployée votre application. Certains problèmes récurrents et couteux en perte de temps apparaissent dans les systèmes massivement distribués, ici un bon exemple est : L adresse du WSDL est à : http://localhost:50855/conversionservice.svc?wsdl Si vous testez cette exemple comme moi en hébergent le service WCF sur un ordi et le consommateur Java sur un autre, lorsque vous passerez cette adresse la machine où le client Java est présent pensera que le localhost est en réalité lui-même donc cherchera le wsdl sur son port machine 50855 alors qu il n y est pas Pour pallier à cela remplacez le localhost de l adresse par l IP de l ordinateur ou le service WCF est hébergé exemple avec 192.168.1.10 :http://192.168.1.10:50855/conversionservice.svc?wsdl Sachant que vous pourriez aussi rencontrer des problèmes du style firewall, port inaccessible, sousréseaux, résolution DNS si vous précisez un nom d hôte au lieu d une adresse IP Après avoir pris conscience des problèmes possible et avoir ajusté l adresse du WSDL, cliquez sur «Finish».
10 WCF et intéropabilité avec JAVA Notre projet devrait ressembler à ceci : Dans notre classe Main.java, dans la fonction «main» il faut écrire les lignes suivantes : Ces lignes nous permettront de récupérer le service WCF que l on veut appeler, ensuite le port de l endpoint où l appel sera envoyé pour consommer du service. Puis ensuite afficher le résultat d un conversion d euro en dollar en invoquant l opération de conversion mise à disposition par le contrat de service, ici «eurintousdconversion».
11 WCF et intéropabilité avec JAVA Lançons maintenant l application en cliquant sur le bouton «Run» : Nous obtenons maintenant le résultat suivant : Avec pour 10.0 un retour de 13.6039 $.
12 WCF et intéropabilité avec JAVA 3 Conclusion Le but de ce document n était pas de faire polémique entre Java,.Net, PERL ou n importe quel autre langage de développement, mais nous avons voulu faire prendre conscience que dans la période où nous nous trouvons, tellement d applications ont été développées dans différents langage que, la communication entre ces applications sera l un des points importants des architectures distribuées. Dans les futures décennies, le problème sera aussi la communication entre les nouvelles applications qui seront développées et les systèmes «legacy» hérités des années 80-90 qui couterai trop cher à redévelopper dans les langages de nouvelle génération. Etant un fervent défenseur de SOA et que les web services étant l une de ses grandes parties, l interopérabilité entre les différents langages et applications n est pas total. Le Basic Profile, W3C, WSIT on écrit des spécifications traitant des problèmes d interopérabilité, sur lesquels il serait possible de faire un livre de plusieurs centaines de pages. Différents problèmes d interopérabilité peuvent être par exemple que en Java les long, double sont plus volumineux que en.net, je vous conseille de vivement, et dès le moindre problème d interopérabilité, d aller mettre le nez dans les specs, posts et autres de ces organismes pour éviter de perdre le moins de temps possible. Remarque: j'ai volontairement utilisé NetBeans, car étant plus «user friendly» pour les non java users, il permet en quelques clics de réaliser les étapes précédentes, sinon beaucoup de gens auraient vite lâché le sujet avec Eclipse.