none
Web service entre C++ et C# RRS feed

  • Question

  • Bonjour,

    J'ai besoin de faire communiquer une application C++ avec une autre application C# en utilisant les web services.
    Au travers des ces web service doivent transiter des objets "complexes" (des instances de classe), pas seulement des types de base.
    Le problème, c'est que je ne sais pas trop comment procéder.
    Je recherche donc des informations techniques, des idées sur comment procéder. Quelle technologie utiliser ?

    D'avance merci.

    P.
    lundi 2 novembre 2009 15:51

Réponses

  • Un client C++ multi plateforme accédant à un serveur en C#.

    Il y a pas mal de possibilités théoriques (mono, compilateur C++/CLI sous Linux ?, sérialisation XML via socket, WebService C# sans ASP.NET) etc....

    Mais, moi, j'essayerais d'implémenter les WebServices en C# en utilisant l'infrastructure ASP.NET et j'utiliserais gSOAP (http://www.cs.fsu.edu/~engelen/soap.html) coté client pour générer les classes proxy C++ d'accès aux Web Services ASP.NET C#.

    L'utilisation de gSOAP côté client et des attributs de sérialisations XML côté serveur permettra de facilement transmettre une structure composite. C'est bien une structure inerte et non une classe avec comportement qui est facilement transférable. Il est facile de "remplir" une classe C# à partir d'une sérialisation XML. Le plus compliqué est de faire cette sérialisation coté client avec gSOAP.

    C'est une solution qui marche avec les contraintes indiquées mais c'est pas la seule, mais je l'ai déjà mis en oeuvres "sans grandes difficultés".
    N'hésitez pas à fournir d'autres contraintes pour voir si cette solution est toujours viable ou s'il faut en changer.


    Paul Bacelar, Ex - MVP VC++
    • Marqué comme réponse Polysil lundi 16 novembre 2009 15:09
    mercredi 4 novembre 2009 00:02
    Modérateur

Toutes les réponses

  • Vous nous demandez des informations sur les technologies à utiliser mais vous en imposées dès le départ.
    Ce n'est pas très logique.
    Les WebService ne sont pas la solution idéale pour faire transiter des objets "complexes" (avec comportement) entre 2 programmes.
    Dans vos 2 applications, laquelle est le serveur de l'autre (notion client/server) ?
    Quelles contraintes sur les plateformes hébergeant chacune des applications ?
    Quelles contraintes d'interconnexion entre chacune des applications ?
    Le niveau de performance attendu ou espéré.
    etc.

    En résumé, donnez-nous le problème et pas un début de solution qui ne sera pas la meilleure.
    Paul Bacelar, Ex - MVP VC++
    mardi 3 novembre 2009 00:12
    Modérateur
  • Bonjour,

    Au niveau déploiement, je dois avoir une machine win32 hébergeant la partie serveur en C# et sur une autre machine le client en C++.
    Le besoin est de pouvoir échanger entre ces 2 machines des objets (des classes). Par contre, ces classes sont assez simples, c'est à dire qu'il s'agit surtout d'un ensemble d'attributs et très peu de méthodes. Il existera une implémentation de cet objet en C++ et en C#.
    Exemple :
    Je dois pouvoir faire transiter une classe Personne ayant comme attributs : nom, prenom, age, adresse, etc ...
    J'aurais donc une classe Personne en C++ et une classe Personne en C#.
    L'idée est de pouvoir "sérialiser" une instance de la classe Personne en C++ et de la "dé-sérialiser" en C# via des web services (ou autre ?).
    A terme, le client C++ sera multi plateforme (Win32, Linux) mais le serveur restera en C#.

    J'espère avoir réussi à être plus précis dans l'exposé de mon problème.

    P.
    mardi 3 novembre 2009 09:42
  • Un client C++ multi plateforme accédant à un serveur en C#.

    Il y a pas mal de possibilités théoriques (mono, compilateur C++/CLI sous Linux ?, sérialisation XML via socket, WebService C# sans ASP.NET) etc....

    Mais, moi, j'essayerais d'implémenter les WebServices en C# en utilisant l'infrastructure ASP.NET et j'utiliserais gSOAP (http://www.cs.fsu.edu/~engelen/soap.html) coté client pour générer les classes proxy C++ d'accès aux Web Services ASP.NET C#.

    L'utilisation de gSOAP côté client et des attributs de sérialisations XML côté serveur permettra de facilement transmettre une structure composite. C'est bien une structure inerte et non une classe avec comportement qui est facilement transférable. Il est facile de "remplir" une classe C# à partir d'une sérialisation XML. Le plus compliqué est de faire cette sérialisation coté client avec gSOAP.

    C'est une solution qui marche avec les contraintes indiquées mais c'est pas la seule, mais je l'ai déjà mis en oeuvres "sans grandes difficultés".
    N'hésitez pas à fournir d'autres contraintes pour voir si cette solution est toujours viable ou s'il faut en changer.


    Paul Bacelar, Ex - MVP VC++
    • Marqué comme réponse Polysil lundi 16 novembre 2009 15:09
    mercredi 4 novembre 2009 00:02
    Modérateur
  • Bonjour,

    Réaliser des Web services avec C# n'est pas très difficile, peut-être en utilisant WCF de .NET 3 et +.
    En C++ c'est un peu plus complexe, mais il y a une API réseau (une "stack") dans Windows 7 qui permet d'effectuer cela facilement. Voir ici par exemple http://weblogs.asp.net/kennykerr/archive/2009/11/04/windows-with-c-windows-web-services.aspx, il y a aussi un article dans le dernier MSDN magazine à ce sujet également.
    Par contre, si ce n'est pas sous Windows 7, faire communiquer une application C++ avec un web service ne va pas être facile du tout. Il faudrait peut-être alors songer à réécrire une partie de cette application C++ en C#, et peut-être avoir une DLL en C# appelée par du code C++ natif. Ce qui n'est pas idéal non plus comme solution...

    Pierre Morel-Fourrier
    www.blogmfc.com

    mercredi 4 novembre 2009 16:08
    Auteur de réponse
  • Je tiens à signaler que les options de Pierre ne semblent pas convenir à un client sous Linux, à moins que le projet Mono est mit en branle un portage C++/CLI.

    gSOAP pour un client C++ permet de conserver la portabilité.
    Paul Bacelar, Ex - MVP VC++
    mercredi 4 novembre 2009 22:28
    Modérateur
  • Bonjour,

    Je confirme que les classes qui transiterons entre le C++ et le C# sont des classes inertes.
    Étant donné que gSOAP est disponible sur Windows et Linux, il est très intéressant. Je dois y regarder de plus prêt.
    Par contre, niveau C# je ne saisis pas très bien comment je vais "recevoir" mes données. Qu'est ce que je dois implémenter pour : "remplir" une classe C# à partir d'une sérialisation XML ?
    Est ce qu'on peut faire ça avec WCF ? Est ce que je dois utiliser gSOAP aussi côté C# ?


    P.
    jeudi 5 novembre 2009 09:02
  • Bonjour Pierre,

    Merci pour cet article. Mais ma 2e grande difficulté (la 1ere étant de faire un web service en C++) c'est que mon client C++ est multi plateforme (Linux et Windows XP).
    Les données envoyées au serveur C# proviendront de plusieurs clients sur plusieurs OS (Linux, Windows XP). 
    C'est là la grande difficulté.

    P.
    jeudi 5 novembre 2009 09:06
  • C# dispose du concept d'attribut qui est largement utilisé pour la sérialisation et la déserialisation des objets, et tout particulièrement pour celles en XML.
    http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.aspx
    http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeattribute.aspx
    http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlignoreattribute.aspx

    Il est aussi largement utilisé pour l’implémentation sde Web Service dans ASP.NET (avec ou sans WCF).
    http://msdn.microsoft.com/fr-fr/library/system.web.services.webserviceattribute.aspx
    http://msdn.microsoft.com/fr-fr/library/system.web.services.webmethodattribute.aspx

    L'approche orthodoxe de l'implémentation des Web Service est de spécifier un contrat d'interface en WSDL et de générer une implémentation serveur et une implémentation pour le client. Mais cela implique une grande maitrise du WSDL, se qui n'est pas trivial.

    En étant moins orthodoxe et plus sujet à des problèmes de compatibilité, est de faire une implémentation de la partie serveur des Web Service dans ASP.NET avec les attributs ad hoc (en WCF des attributs sont différent mais le principe est le même). ASP.NET génèrera automatiquement un WSDL correspondant aux méthodes du Web Service implémenté et au objet passés en paramètres, tout cela grâce à l'utilisation des attributs.
    Vous n'aurez plus qu'à générer la partie cliente de ce Web Services. En espérant que gSOAP dispose maintenant d'un générateur de classe de proxy client comme le propose Visual Studio pour les langages .NET.


    Paul Bacelar, Ex - MVP VC++
    dimanche 8 novembre 2009 22:46
    Modérateur
  • Bonjour,

    Je confirme aujourd'hui la faisabilité technique. Je n'ai pas encore tout testé mais les premiers tests sont significatifs.
    J'ai un serveur en C# et je génère le client à l'aide de gSOAP (en C++ depuis Windows ou Linux).
    Et ça fonctionne !
    Il me reste encore à trouver comment "isoler" le code généré du code programmeur et faire quelques tests de performances mais les premiers pas sont rassurants.
    Merci à tous.

    lundi 16 novembre 2009 15:08