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

Windows Forms Discussion :

[C#][WebServices] Appel methode avec une classe en paramètre


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 84
    Points
    84
    Par défaut [C#][WebServices] Appel methode avec une classe en paramètre
    Salut,

    Framework 1.1
    Langage = C#

    je bosse sur un WebService qui contient une Webmethod du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [WebMethod]
    public String WriteTXTPersonne(ClassLib.ClassPersonne p)
    { // Blah blah blah mon traitement
    }
    avec ClassPersonne du genre :

    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
     
     
    [Serializable]
    [XmlRoot ("ClassPersonne") ]
    public class ClassPersonne
    	{	
    		public ClassPersonne()
    		{
    			//Constructeur par défaut
    		}
     
     
    		private String _Nom;
    		public String Nom
    		{
    			get{ return _Nom;}
    			set { _Nom = value;}
    		}
     
     
    }
    Pour appeller cette methode j'ai un client Win32 qui utilise SOAP ( MSSOAP 3.0) , la méthode est bien appelée le XML SOAP en entrée est bien formé , conforme au WSDL généré par le service mais impossible de lui passer mon type de données en paramètre..

    voici l'erreur renvoyée par le service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.NullReferenceException: Object reference not set to an instance of an object
    J'ai tout essayé : Serializer, catch du flux SOAP en entrée (utile pour vérifier ce qui rentre et qui sort qd mm ;)) ), faire de cette classPersonne une DLL Win32 référencée à la fois dans le service et dans le client . ...

    Rien , il ne veut pas "mapper" les données ni Désérializer le XML envoyé par mon client..

    Si vous avez des idées ca serait super je galère vraiment..

    Merci à tous et toutes ..

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    salut

    je fais pas (encore) de webservices mais un type ayant la meme problematique que toi a ecrit ce petit article:
    http://www.dalepreston.com/programming/SharedClasses.aspx

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Salut,

    désolé de répondre ausis tard mais comme j'ai maxi galéré la dessus j'ai du trouver une autre solution pour avancer.
    Du coup je passe les données en string XML que je Sérialize DéSérialize dans mes objets.. C'est pas mal , ca marche .. mais ca fait chier , c'est pas ce que je veux faire.

    En ce qui concerne cet article est surement le plus complet que j'ai pu trouvé sur le sujet (et j'en ai éclusé un bon paquet) , merci bcp de me l'avoir indiqué.

    Néanmoins autre pb qd j'ai voulu tester la méthode de l'article je me suis rendu compte que VS .NET 2003 v 7.1.3088 ne me génère pas le référence.cs (alors que pour d'autrres projets que j'ai réalisé ailleurs ce fichier est bien là !!) donc impossible de tester ca ...

    grrrrr Microsoft quand tu t'y mets ;))))

    Quelqu'un a une idée ?

  4. #4
    Membre expert

    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 737
    Points : 3 137
    Points
    3 137
    Par défaut
    il est codé en quoi ton client ?

    tu peux nous donner, au moins, le code que tu utilise pour appeler le WS ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Bon je rectifie mon précédent mess ..
    en faisant un client .NET le Reference.cs est bien crée.. :oops:
    Désolé.. je cherchais le reference.cs dans le WebService comme un abruti. Honte à moi et sur ma descendance pendant 12 générations.

    Mon pb reste qd mm entier.. mon client est pour l'instant en VB6 .

    De plou en plou fort voici le code VB 6 :


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    'pour empaqueter notre message au format SOAP
    Dim Serializer As MSSOAPLib30.SoapSerializer30
     
    'pour lire la reponse SOAP
    Dim Reader As MSSOAPLib30.SoapReader30
     
    'Pour se connecter au service
    Dim Connector As MSSOAPLib30.SoapConnector30
     
     
    'XML pour parser la reponse SOAP
    Dim objResponse As MSXML2.IXMLDOMNodeList
    Dim objNodeResponse As IXMLDOMNode
     
     Me.MousePointer = vbHourglass
     
     '   Connect
     
        On Error GoTo errorHandler
     
     
     
        Set Connector = New MSSOAPLib30.HttpConnector30
     
        'voir tag soap:adress dans la WSDL générée par le service
        Connector.Property("EndPointURL") = ChaineConnectionService_LowLevel
        'Connector.Connect
     
        'on définit l'action (la WebMethode)à lancer cf tag soap:soapAction dans la WSDL générée
        Connector.Property("SoapAction") = "http://tempuri.org/Init"
     
        Connector.BeginMessage
     
            Set Serializer = New SoapSerializer30
     
            'oninitialise le Serializer avec les données xml générées par le connector
            Serializer.Init Connector.InputStream
     
                'Construction du message SOAP
                With Serializer
                        .StartEnvelope              ' <SOAP-ENV:Envelope>
                        .StartBody                  ' <SOAP-ENV:Body>
                        'prend en param
                        '<Nom>Nom</Nom>
     
                        'Initialisé avec le nom de la méthode et l'URI du nameSpace de la WebMethod
                        .StartElement "Init", "http://tempuri.org/" ' <Init>
     
                        .StartElement "Pers"                     ' <Pers> : nom de la variable en entrée
     
                        .StartElement "Nom"           ' <Nom>
                        .WriteString PersonneIn.Nom
                        .EndElement                             ' </Nom>
     
     
                        .EndElement                 ' </Pers>
                        .EndElement                 ' </Init>
     
     
                        .EndBody                    ' </SOAP-ENV:Body>
                        .EndEnvelope                ' </SOAP-ENV:Envelope>
     
     
                End With
     
                'envoi du message SOAP
                Connector.EndMessage
     
     
                Set Reader = New MSSOAPLib30.SoapReader30
     
                'init du reader
                Reader.Load Connector.OutputStream
     
     
                'reperer le tag </faultString> pour voir si on a une erreur
                If (Len(Reader.FaultString.Text) > 0) Then
                    MsgBox Reader.FaultString.Text
                End If
     
               ' MsgBox Reader.Body.Text
     
     
                Set objResponse = Reader.RpcResult.childNodes
     
     
     
                For Each objNodeResponse In objResponse
     
                    Select Case objNodeResponse.nodeName
                    'voir la reposne SOAP de la webMethod du service
                    'description dans la page du service MsgBox "Response de la WebMethode : " & objNodeResponse.nodeTypedValue
                        Case "InitResult"
                                tbResSte.Text = "Response de la WebMethode InitSociete : " & objNodeResponse.nodeTypedValue
     
                    End Select
     
                Next objNodeResponse
     
          Me.MousePointer = vbDefault
     
        Exit Sub
     
     
     
    errorHandler:
     
        MsgBox "ERROR: " & Err.Description, vbExclamation
        Err.Clear

    a noter la variable PersonenIn est issu d'un objet COM (j'ai essaye en référencant cet objet COM sous .NET et en l'utilisant ca marche pas non plus.. par contre je n'ai pas essayé avec ma DLL personne .NEt référencée sous VB ... je sais que ca se fait)

    voici le soap en entrée du WebService methode Init :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAPSDK4:Init xmlns:SOAPSDK4="http://tempuri.org/">
    <Pers>
    <Nom>Aldo el magnifico</Nom>
    </Pers>
    </SOAPSDK4:Init>
    </SOAP-ENV:Body></SOAP-ENV:Envelope>



    voici le XML demandé gentilment fourni par .Net:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <Init xmlns="http://tempuri.org/">
          <Pers>
            <Nom>string</Nom>
          </Pers>
        </Init>
      </soap:Body>
    </soap:Envelope>

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Pour info je viens d'essayer en référencant ma la DLL .NET (avec l'objet Pers) utilisée par le service dans mon appli Win32 VB6 hé ben c'est tout pareil : ca marche pô...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Ca y est j'ai trouvé après moult galères c'était une erreur de formation de MSSOAP 3.0 , lui passer tous les paramètres c'est mieux.

    La solution :

    1- vous faites de vos classes .NET une assembly (DLL .NET) que vous référencez dans le GAC et ensuite pour votre service .NEt

    2- exportez cette DLL pour qu'elle soit utilisable comme un composant COM

    3- dans l'appli Win32 créer votre objet (Pers en l'occurence ici ) à partir de cet objet "COM"

    4- Utilisez le code suivant et n'oubliez pas dans le StartElement l'URI de la methode !!! ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StartElement "Nom" ,"http://tempuri.org/", "NONE", ""
    par exemple :

    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
    'oninitialise le Serializer avec les données xml générées par le connector 
            Serializer.Init Connector.InputStream 
     
                'Construction du message SOAP 
                With Serializer 
                        .StartEnvelope              ' <SOAP-ENV:Envelope> 
                        .StartBody                  ' <SOAP-ENV:Body> 
                        'prend en param 
                        '<Nom>Nom</Nom> 
     
                        'Initialisé avec le nom de la méthode et l'URI du nameSpace de la WebMethod 
                        .StartElement "Init", "http://tempuri.org/" ' <Init> 
     
                        .StartElement "Pers"                     ' <Pers> : nom de la variable en entrée 
     
                        .StartElement "Nom" ,"http://tempuri.org/", "NONE", ""            ' <Nom> 
                        .WriteString PersonneIn.Nom 
                        .EndElement                             ' </Nom> 
     
     
                        .EndElement                 ' </Pers> 
                        .EndElement                 ' </Init> 
     
     
                        .EndBody                    ' </SOAP-ENV:Body> 
                        .EndEnvelope                ' </SOAP-ENV:Envelope> 
     
     
                End With
    voilà grosso modo la marche à suivre..
    je ne sais pas si ca interesse du monde en cas... laissez moi un message si ca ne fonctionne pas chez vous..

    69+

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

Discussions similaires

  1. Appelle methode d'une JFrame d'une autre classe
    Par steftanguy dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/08/2007, 11h01
  2. [debutant] appelle de la methode d'une classe..
    Par pseudobidon57 dans le forum Langage
    Réponses: 2
    Dernier message: 21/06/2007, 18h02
  3. Probleme avec la recherche directe de methodes sur une Class (API java.lang.reflect)
    Par CyberChouan dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 25/01/2007, 17h12
  4. faire appel à une methode d'une classe bean
    Par senediene dans le forum Struts 1
    Réponses: 1
    Dernier message: 24/08/2006, 10h13
  5. Réponses: 11
    Dernier message: 16/10/2005, 20h21

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