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#] Questions sur les webmethodes et leur utilisation


Sujet :

Services Web

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut [C#] Questions sur les webmethodes et leur utilisation
    Bonjour,

    J'ai plusieurs petites questions :
    J'ai généré 2 webservices. Un de test et un autre qui me servira à ma production.

    Le premier que j'ai nommé "testAnimal" est un simple webservice qui prend comme paramètre d'entrée un "string" et qui renvoi un objet de type "animal" contenant le string passé en paramètre ainsi que des valeurs prédéfinis

    CLASSE ANIMAL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [Serializable]
    public class animal
    {
        public string race;
        public int age;
        public string continent;
        public string nom;
    }
    WEB METHODE ANIMAL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [WebMethod]
        public animal testAnimal(string n)
        {
            animal o = new animal();
     
            o.nom = n;
            o.age = 15;
            o.continent = "europe";
            o.race = "félin";
     
            return o;
        }
    Je me suis donc codé un petit client qui me permet de tester mon web service.
    J'ai donc importer une nouvelle référence web via le WSDL. Le proxy a été créé.

    Code d'appel à la WEB METHOD dans mon client de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static void TestMethodeAnimal()
            {
                TestWSDL.transfert.animal reponse;
                transfert.Service o = new transfert.Service();
                reponse = o.testAnimal("toto");
     
                Console.WriteLine(reponse.nom);
                Console.WriteLine(reponse.race);
                Console.WriteLine(reponse.age);
                Console.WriteLine(reponse.continent);
     
                Console.ReadLine();
            }
    Jusque là, tout va bien, mon service me répond bien.

    Là où ca se corse, c'est pour mon autre méthode, celle de qui sera utilisée.
    Elle prend en paramètre un objet plus complexe (avec des accesseur set/get ainsi que d'autres méthodes public).
    Imaginons, j'ai un objet X, je souhaite passer cet objet à ma webmethode : Je déclare donc un objet X de type "TestWSDL.transfert.monObjet"

    Je souhaite ensuite remplir cet objet afin de l'envoyer à ma méthode. Problème, les accesseurs d'écriture/lecture et tous les autres ne sont pas disponible, je ne les vois pas.

    A noté que je ne vois pas non plus certains objets qui ne sont utilisé que au sein de l'objet X.

    Y-a-t-il quelque chose à faire ou bien j'ai loupé quelque chose ?

    merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 619
    Points
    1 619
    Par défaut
    salut
    il me semble j'avais essayé à l'époque mais je crois que les assesseurs et les webservice ca n'est pas encore ça. je crois qu'il faut que tu passes tes données dans les parametres de ta méthode. d'un autre coté c'est logique vu qu'il n'y a que de webmethod.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Mais ma webmethod me renvoi un objet de type Y. Comment faire pour accéder aux propriétés de cet objet qui sera donc du type "TestWSDL.transfert.Y" si je n'ai pas accès aux accesseurs de cet objet ?

    En fait, je souhaiterais faire ca dans mon client de test :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public static void TestTransfert()
            {
                TestWSDL.transfert.beanReponseTransfert reponse = new TestWSDL.transfert.beanReponseTransfert();
                TestWSDL.transfert.beanTransfert question = new TestWSDL.transfert.beanTransfert();
                TestWSDL.transfert.bean T1 = new TestWSDL.transfert.bean();
                TestWSDL.transfert.bean T2 = new TestWSDL.transfert.bean();
                TestWSDL.transfert.bean[] liste = new TestWSDL.transfert.bean[2];
     
                T1.setCodeBase("00000001");
                T1.setEtat(1);
                T1.setNumInt("1");
                T1.setPjAttendue(false);
                T1.setBlocXML(new StreamReader("C:\\test\\T2.xml").ReadToEnd());
     
                liste.SetValue(T1, 0);
     
                T2.setCodeBase("00000002");
                T2.setEtat(2);
                T2.setNumInt("2");
                T2.setPjAttendue(false);
                T2.setBlocXML(new StreamReader("C:\\test\\T3.xml").ReadToEnd());
     
                liste.SetValue(T2, 1);
     
                question.setListe(liste);
                question.setDateEnvoi(DateTime.Now);
     
                Console.WriteLine("Calling the SOAP Server");
     
                transfert.Service o = new transfert.Service();
                reponse = o.transferer(question);
     
                Console.ReadLine();
                foreach (beanReponse v in reponse.getListeReponse())
                {
                    Console.WriteLine("-------------------------------");
                    Console.WriteLine("CodeBase : " + v.getcodeBase());
                    Console.WriteLine("Code Retour : " + v.getCodeRetour());
                    Console.WriteLine("NumInt : " + v.getNumInt());
                }
            }
    Donc, dans ce code :
    -"TestWSDL.transfert.beanReponseTransfert" et "TestWSDL.transfert.beanTransfert" existe bien, je peux donc créer un objet de ce type mais pas accéder aux méthodes écrites dans cet objet
    - "TestWSDL.transfert.bean" n'existe pas. Il n'a pas été importé. Il sagit d'un objet contenu dans un tableau présent dans l'objet de type "TestWSDL.transfert.beanTransfert"
    - Bien entendu, les "T1.xxxxx" et "T2.xxxxx" ne fonctionne pas puisqu'il ne reconnait pas le type.

    J'avoue que je suis paumé là

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 619
    Points
    1 619
    Par défaut
    tu asjoutes la définition de ta classe dans ton client. ainsi tu auras accès à ces propriétés et ses methodes.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Si par "définition de la classe dans le client" tu entends importer ma classe dans mon client, non je ne les ai pas importée. Mais de toute facon, je ne pourrais pas utiliser les méthodes puisque l'objet dans mon client n'aura pas comme type "beanTransfert" mais "TestWSDL.transfert.beanTransfert".

    je me trompe ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Je vais poser la question différemment, peut-être mon problème sera plus compréhensible :

    Comment faire pour que les méthodes d'un objet renvoyé par une web méthode soit accessible pour le client qui a interrogé cette webmethode afin de pouvoir récupérer/manipuler les attributs privés de cet objet renvoyé ?

    Actuellement, seuls les attributs public de cet objets sont récupérables et mon objet cntient des attributs privés.

    Je suis complétement bloqué à cause de ça

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 619
    Points
    1 619
    Par défaut
    avec la reflection peut être?
    mais ils sont privés pourquoi veux tu y accéder?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    En faite, il s'agit d'un webservice qui sera appelé par un programme écrit en Java. Le client envoi à mon webservice un objet et je lui en retourne un autre. Ces objets ont des attributs privés (défini dans le cahier des charges) qui ne sont accessible que par des get/set (exemple : getNom(),setNon(), etc...)

    Cependant, je n'arrive pas à comprendre pourquoi l'objet que je retourne ne contient pas les methodes qu'il contient pour accéder aux parties privés.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Sinon, imaginons que je mettes tous les attributs de toutes mes classes en public afin de pouvoir y accéder, j'ai un autre problème.

    Lorsque j'accède au WSDL de mon service, certains objets ne sont pas décrits.
    Dans les faits :
    Dans mon projet nommé "ProjetWebService", j'ai au total 13 classes. Seulement, dans le WSDL, je n'ai que 2 classes de décrite (l'objet en entrée et l'objet en sortie de ma webmethode). Cependant, j'aurais besoin dans mon WSDL d'inclure également la description des autres objet.

    Quelqu'un pourrait m'aiguiller ?

    Merci à tous

  10. #10
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Salut,

    Je ne vais pas te faire un cours de la serialisation XML mais effectivement tu ne peux serialiser que les membres publiques et pas les méthodes. Donc pour pouvoir acceder à tes membres il faut les mettres publique

    Sinon pour ta deuxieme question, il n'ya aucun interet que l'utilitaire utilisé par VS te genere la description des classes que tes web methods n'utilisent pas. Pourquoi le proxy coté client doit te fournir l'interface de ces classes alors qu'elles ne seront pas utilisées pour invoquer des services Web ?
    Mehdi Feki : Modérateur .Net

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 68
    Points : 39
    Points
    39
    Par défaut
    Merci pour tes réponses.

    J'ai en effet passé tous mes attributs en public et cela fonctionne nickel.

    Autre petite question pendant que j'y suis :
    J'ai un exemple de webmethod écrite en Java que je dois retranscrire dans mon webservice (donc écrit en C#). Cette webmethod a 2 paramètres en entrée.

    Pour l'un, pas de problème mais pour l'autre, il s'agit dans l'exemple d'un "DataHandler".
    Quel type en C# dois-je utiliser dans ma webmethod qui est l'équivalent du datahandler en Java ?

    Merci

    Je vais créer un nouveau topic pour ma question

Discussions similaires

  1. Question sur les bases : utilisation d'un tableau
    Par TabrisLeFol dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/12/2009, 12h37
  2. Réponses: 1
    Dernier message: 26/02/2009, 16h59
  3. Réponses: 3
    Dernier message: 04/04/2008, 18h02
  4. Questions sur les shaders et leurs performances
    Par Dracul86 dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 12/08/2007, 11h32
  5. Réponses: 9
    Dernier message: 17/03/2007, 05h49

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