IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

[C#]Traiter une requête SOAP


Sujet :

Services Web

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut [C#]Traiter une requête SOAP
    Bonjour,
    Je n'ai jamais utilisé de web services jusqu'à maintenant, mais un client nous fait une demande particulière à laquelle je dois répondre assez rapidement.
    Celui-ci a des automates qui sont capables d'envoyer des relevés par requêtes SOAP et il aimerait que cela génère des saisies automatiques dans la base de données de notre logiciel...

    Typiquement leur requête serait du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myur="http://myURI.org">
       <soapenv:Header>
          <myur:securityHeader>
             <myur:username>Thibaut</myur:username>
             <myur:password> TVyap2P/voFTU0qg1bZe5dMvu9s=</myur:password>
          </myur:securityHeader>
       </soapenv:Header>
       <soapenv:Body>
          <myur:getEventTLGRequest>
             <myur:sourceId>123</myur:sourceId>
             <myur:eventId>4598</myur:eventId>
             <myur:eventNature>2</myur:eventNature>
             <myur:eventDescription>Power supply back</myur:eventDescription>
             <myur:eventDate>01/07/2011 18:08:35</myur:eventDate>
          </myur:getEventTLGRequest>
       </soapenv:Body>
    </soapenv:Envelope>
    J'ai cherché sur le net pour voir des tutoriaux...A priori, je vois un peu comment faire un web service avec la mise en place des fonctions...mais les exemples que j'ai vu sont souvent juste une fonction sans paramètres ou avec un ou deux paramètres integer ou chaines.

    Comment procède-t-on avec une requête SOAP ? Dans mon cas, je dois vérifier que l'entête correspond bien à un utilisateur identifié dans la base (avec son mot de passe crypté) et faire un insert dans la base avec les valeurs de champs du corps XML...Seulement comment fait-on ? Côté serveur, comment réceptionne-t-on une telle requête (en tête/corps XML) ?

    Je ne m'inquiète pas sur le traitement d'identification/décodage et d'injection dans la base, mais plutôt sur comment mettre une/des fonction(s) en vis-à-vis de la requête ? Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Sur quel langage/plateforme travailles-tu?

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    Je travaille en ASP.NET / C# sous VS 2008

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Tu peux exposer des services via WCF. Ainsi, tu exposes une url de type http://www.chezmoi.net/monService.svc et derriere la communication se fait en SOAP de manière transparente pour toi

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    heu...Tu n'aurais pas un lien vers un exemple ou un tuto...parce que cela parait peut-être simple dans le principe, mais concrètement, cela se réalise et s'implémente comment ?

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Un tutoriel est disponible:
    http://vincentlaine.developpez.com/tuto/dotnet/wcf/
    Ainsi que la documentation officielle:
    http://msdn.microsoft.com/en-us/libr...(v=VS.90).aspx

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    En fait, je pensais juste faire un web service sous VS 2008, du genre qui te génère par défaut une trame comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    using System;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Linq;
     
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    // Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX, supprimez les marques de commentaire de la ligne suivante. 
    // [System.Web.Script.Services.ScriptService]
    public class Service : System.Web.Services.WebService
    {
        public Service () {
     
            //Supprimez les marques de commentaire dans la ligne suivante si vous utilisez des composants conçus 
            //InitializeComponent(); 
        }
     
        [WebMethod]
        public string HelloWorld() {
            return "Hello World";
        }
     
    }
    et juste définir une (ou plusieurs) webmethods pour gérer les requêtes SOAP qui me sont envoyées via http sur le serveur web. Cela n'est pas possible ?

    WCF m'a l'air bien lourdingue pour mon besoin...Je n'ai pas besoin de faire tout un projet de communication, mais juste réceptionner un type de requête et le traiter (faut que ce soit le moins couteux en temps et pas trop complexe).

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Lorsque tu crées une classe, au lieu de choisir "Web Service" qui est l'ancienne version pré-WCF, sélectionne "WCF Service". Y'a pas grand interêt à encore utiliser les asmx alors que WCF est mieux.

    Pour exposer un service wcf c'est vraiment pas sorcier, il te faut:
    • un point d'entrée MyService.svc
    • Une interface qui est le contrat du service IMyService
    • Une implémentation de ce service MyServiceImpl
    • 2-3 lignes dans le fichier de config pour faire la glue entre


    Y'a rien de sorcier la dedans, cf cet exemple
    http://msdn.microsoft.com/en-us/libr...(v=VS.90).aspx

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    L'intérêt c'est de pouvoir être prêt tout de suite...Je cherche une solution la plus simple possible et rapide à mettre en place...Je dois me prononcer très vite : est-ce qu'on le fait ou pas ? Si on doit prendre des jours ou des semaines pour comprendre déjà comment marche le WCF, cela ne nous intéresse pas...Ce type de fonctionnement est juste une verrue sur le fonctionnement de notre site web (juste une histoire d'appel d'offre ponctuel auquel un commercial tient alors je jette quand même un oeil), on ne veut vraiment pas s'investir là-dedans (mais alors là, vraiment pas !)...si cela doit coûter plus de deux semaines homme, on laisse tomber...

    Sinon, dans les exemples, rien sur le traitement SOAP, non ?...Y a toujours les exemples à la noix avec une addition, une soustraction...

    J'ai bien trouvé cela : http://msdn.microsoft.com/en-us/libr...=VS.80%29.aspx mais je ne comprend pas comment on relie ce qui est passé en requête de ce qui est réceptionné (si on fait un objet header et un objet body par exemple...comment on injecte les données du XML dans les objets C#)

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Je vois vraiment pas en quoi WCF est compliqué
    C'est de vouloir implémenter sa version de SOAP qui me parait risqué! WCF est solide, flexible, éprouvé et bien documenté.
    Créer un service c'est une classe et une interface, c'est quand même pas la mer à boire.
    Surtout si après tu dois implémenter des scénarios plus complexe comme une authentification par login/password, certificat, jeton sur des moyens comme http et https. Tu peux même faire du REST+XML ou du REST+Json.

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    Je ne veux pas de complexité...pas de certificats, de jetons et compagnie...la requête ne peut être faite que par un automate qui fait une requête SOAP et l'envoi par le net...je dois juste savoir la lire et générer un INSERT dans ma base en réaction à l'évènement...ce n'est pas moi qui définit le protocole d'échange, je dois m'y adapter (si on décide de le faire...mais je commence vraiment à douter)...Que ce soit WCF ou son ancienne version, ce n'est pas la problématique (quoique ma préférence ira au plus rapide à implémenter, ce qui me semble être Web service et non pas WCF, mais bon, je n'ai regardé cela qu'hier après tout)...L'important dans un premier temps est comment exploiter SOAP ? Doit-on tout implémenter soi-même (lire le flux http, analyser le xml,...) ou existe-t-il ce qu'il faut dans VS 2008 pour s'en dispenser ? En bref : Comment procède-t-on concrètement ?

  12. #12
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Je pense qu'il y'a un problème dans ta compréhension de SOAP. Ca n'est pas "juste du xml". Il y'a toute une logique autour pour que ca fonctionne. tu dis par exemple que tu ne veux pas de complexité pourtant tu as quand meme une authentification par login/pwd dans le message.
    As tu essayé l'exemple fourni dans MSDN?

    Si tu veux le traiter comme du xml, libre à toi de galérer. Mais pour procéder efficacement WCF reste la solution, personne a eu l'idée absurde de refaire une librairie SOAP vu que WCF est très compétent en la matière.

  13. #13
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    Je me doute bien que depuis le temps que SOAP existe, il y a de quoi l'utiliser sans réinventer la roue...et que cela n'a pas attendu WCF...mais voilà, COMMENT l'utilise-t-on CONCRETEMENT ? Comment le web service réagit à la sollicitation d'une requête SOAP ? Comment récupérer ces données au sein d'un objet ? Y a-t-il une fonction (nom générique, déterminisme par rapport à la structure (entête/body du xml)) à définir pour ce faire ? Dans les bouquins (que j'ai sous la main), sur les sites que j'ai visités, sur les forums, tous s'accordent à dire que c'est facile, mais personne ne montre le moindre exemple côté serveur, ne serait-ce qu'une petite implémentation de traitement de requête SOAP...

  14. #14
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Unusual Voir le message
    Je me doute bien que depuis le temps que SOAP existe, il y a de quoi l'utiliser sans réinventer la roue...et que cela n'a pas attendu WCF...mais voilà, COMMENT l'utilise-t-on CONCRETEMENT ? Comment le web service réagit à la sollicitation d'une requête SOAP ? Comment récupérer ces données au sein d'un objet ? Y a-t-il une fonction (nom générique, déterminisme par rapport à la structure (entête/body du xml)) à définir pour ce faire ? Dans les bouquins (que j'ai sous la main), sur les sites que j'ai visités, sur les forums, tous s'accordent à dire que c'est facile, mais personne ne montre le moindre exemple côté serveur, ne serait-ce qu'une petite implémentation de traitement de requête SOAP...
    Ben si tu utilises WCF, une instance de ton objet est créée et la méthode est appellée de manière totalement transparente.
    A vue de nez tu devrais avoir un truc a peu près comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public interface MyContract
    {
        void getEventTLG(int sourceId, inteventId, int eventNature, string eventDescription, DateTime eventDate);
    }
     
    public class MyService
    {
        public void getEventTLG(int sourceId, int eventId, int eventNature, string eventDescription, DateTime eventDate)
        {
            //tu fais ce que tu veux avec les paramètres!
        }
    }

  15. #15
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Pour completer ma réponse:
    SOAP est postérieur à .Net. Dans un premier temps il y'avait en effet les ASMX pour faire du SOAP puis depuis le 3.5 WCF est préféré.
    Du coup personne n'a perdu de temps a refaire du SOAP à la main...

  16. #16
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Ben si tu utilises WCF, une instance de ton objet est créée et la méthode est appellée de manière totalement transparente.
    A vue de nez tu devrais avoir un truc a peu près comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public interface MyContract
    {
        void getEventTLG(int sourceId, inteventId, int eventNature, string eventDescription, DateTime eventDate);
    }
     
    public class MyService
    {
        public void getEventTLG(int sourceId, int eventId, int eventNature, string eventDescription, DateTime eventDate)
        {
            //tu fais ce que tu veux avec les paramètres!
        }
    }
    Ok merci...je vais essayer...

  17. #17
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Je rappelle le très bon exemple détaillé de MSDN, qui est pas à pas:
    http://msdn.microsoft.com/en-us/libr...(v=VS.90).aspx

  18. #18
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Par défaut
    Ca a été chaud...mais cela marche nickel maintenant, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment passer du XML dans une requête SOAP
    Par pdau2571 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/10/2010, 16h13
  2. envoyer une requête soap en java
    Par amina.5 dans le forum Services Web
    Réponses: 3
    Dernier message: 31/01/2010, 20h34
  3. XML Injection dans une requête SOAP
    Par rohrix dans le forum Services Web
    Réponses: 0
    Dernier message: 27/04/2009, 16h26
  4. Parser une requête SOAP
    Par V_R46 dans le forum XML
    Réponses: 1
    Dernier message: 27/02/2009, 18h24
  5. [AXIS2] Envoi d'un type complexe dans une requête SOAP
    Par godolf dans le forum Services Web
    Réponses: 4
    Dernier message: 20/05/2008, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo