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

Web & réseau Delphi Discussion :

Classe non publiée dans un WebService


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Classe non publiée dans un WebService
    Bonjour

    Je suis en train d'écrire un WebService (côté serveur) .
    La compilation est OK mais le WSDL généré ne contient pas une classe (PLAN_ANALYTIQUE) que j'ai pourtant publiée.

    Qu'est qui ne va pas ?

    Merci d'avance pour vos réponses

    l'interface :

    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
    { Interface invocable IGescom }
    unit GescomIntf;
    interface
    uses InvokeRegistry, Types, XSBuiltIns, Gescom, Service_Gescom;
    Type
      { Les interfaces invocables doivent dériver de IInvokable }
      IGescom = interface(IInvokable)
      ['{28E05B14-C9A0-4FD6-8E59-4BC0E31D766C}']
      Function Rechercher_Plan_Analytique(aCode_Analytique:String):Gescom.PLAN_ANALYTIQUE; stdcall;
        { Les méthodes de l'interface invocable ne doivent pas utiliser la convention }
        { d'appel par défaut ; stdcall est conseillée }
     End;
     
    implementation
     
    initialization
      { Les interfaces invocables doivent être recensées }
      InvRegistry.RegisterInterface(TypeInfo(IGescom));
     
    end.
    l'implémentation :

    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
    { Fichier d'implémentation invocable pour TGescom qui implémente IGescom }
     
    unit GescomImpl;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns, GescomIntf, Gescom, Service_Gescom, CER_Fichiers;
     
    type
      TGescom = class(TInvokableClass, IGescom)
     
      public
        Function Rechercher_Plan_Analytique(aCode_Analytique:String):Gescom.PLAN_ANALYTIQUE; stdcall;
     
      end;
     
    implementation
     
      Function TGescom.Rechercher_Plan_Analytique(aCode_Analytique:String):Gescom.PLAN_ANALYTIQUE; stdcall;
      var Mon_Plan_Analytique : PLAN_ANALYTIQUE;
          S : string;
      begin
        Mon_Plan_analytique := PLAN_ANALYTIQUE.Create;
     
        S := 'Code';
        Mon_Plan_Analytique.setCode_analytique(s);
        Mon_Plan_Analytique.code='+Mon_Plan_Analytique.getCode_analytique);
     
        S := 'Libellé';
        Mon_Plan_Analytique.setLibelle(s);
        Mon_Plan_Analytique.libelle='+Mon_Plan_Analytique.getLibelle);
     
        S := 'Libellé court';
        Mon_Plan_Analytique.setLibelle_Court(s);
       Mon_Plan_Analytique.libelle_court='+Mon_Plan_Analytique.getLibelle_court);
     
        result := Mon_Plan_Analytique;
      end;
     
     
    initialization
      { Les classes invocables doivent être recensées }
      InvRegistry.RegisterInvokableClass(TGescom);
     
    end.
    gescom.pas :

    Unit Gescom;
    Interface
    Uses
    SysUtils, InvokeRegistry;
    Type
    PLAN_ANALYTIQUE = Class;

    PLAN_ANALYTIQUE = Class(TRemotable)
    Private _code_analytique:String;
    Private _libelle:String;
    Private _libelle_court:String;

    Published Function getCode_analytique():String;

    Published Function getLibelle():String;

    Published Function getLibelle_court():String;

    Published Procedure setCode_analytique(var aCode_analytique:String);

    Published Procedure setLibelle(var aLibelle:String);

    Published Procedure setLibelle_court(var aLibelle_court:String);
    End;


    Implementation

    Function PLAN_ANALYTIQUE.getCode_analytique():string;
    Begin
    Result := Self._code_analytique;
    End;

    Function PLAN_ANALYTIQUE.getLibelle():String;
    Begin
    Result := Self._libelle;
    End;

    Function PLAN_ANALYTIQUE.getLibelle_court():String;
    Begin
    Result := Self._libelle_court;
    End;

    Procedure PLAN_ANALYTIQUE.setCode_analytique(var aCode_analytique:String);
    Begin
    Self._code_analytique := aCode_analytique;
    End;

    Procedure PLAN_ANALYTIQUE.setLibelle(var aLibelle:String);
    Begin
    Self._libelle := aLibelle;
    End;

    Procedure PLAN_ANALYTIQUE.setLibelle_court(var aLibelle_court:String);
    Begin
    Self._libelle_court := aLibelle_court;
    End;




    End.

    service_gescom.pas :

    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
    Unit Service_Gescom;
    	Interface
    		Uses
    			Gescom,
    			SysUtils;
    		Type
    			SERVICE_PLAN_ANALYTIQUE = Interface;
     
    			SERVICE_PLAN_ANALYTIQUE = Interface
    				Function Rechercher_Plan_Analytique(aCode_Analytique:String):Gescom.PLAN_ANALYTIQUE;
     
    				Function Creer_Plan_Analytique(var aPlan_Analytique:Gescom.PLAN_ANALYTIQUE):Integer;
     
    				Function Modifier_Plan_Analytique(var aPlan_Analytique:Gescom.PLAN_ANALYTIQUE):Integer;
    			End;
     
     
    	Implementation
     
     
    End.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    PLAN_ANALYTIQUE est pourtant un TRemotable
    RegisterInvokableClass ou RegisterInterface doit analyser les propriétés et générer la WSDL contenant ces types
    Est-ce que cette analyse gère aussi les méthodes, paramètres et résultat d'une IInvokabke ?
    Il y a des options dans l'importateur pour forcer l'importation des types non utilisés, j'ai eu avec D7 des surprises à ce sujet

    Faudrait forcer peut-être un RegisterReturnParamNames
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Complément
    Merci shailetroll pour ton aide

    Je n'avais pas posté le WSDL que j'obtiens.

    Peut-être que cela aidera à la résolution de mon problème

    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
     <?xml version="1.0" encoding="utf-8" ?> 
    - <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="IGescomservice" targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns1="urn:Gescom">
    - <types>
    - <xs:schema targetNamespace="urn:Gescom" xmlns="urn:Gescom">
    - <xs:complexType name="PLAN_ANALYTIQUE">
      <xs:sequence /> 
      </xs:complexType>
      </xs:schema>
      </types>
    - <message name="Rechercher_Plan_Analytique0Request">
      <part name="aCode_Analytique" type="xs:string" /> 
      </message>
    - <message name="Rechercher_Plan_Analytique0Response">
      <part name="return" type="ns1:PLAN_ANALYTIQUE" /> 
      </message>
    - <portType name="IGescom">
    - <operation name="Rechercher_Plan_Analytique">
      <input message="tns:Rechercher_Plan_Analytique0Request" /> 
      <output message="tns:Rechercher_Plan_Analytique0Response" /> 
      </operation>
      </portType>
    - <binding name="IGescombinding" type="tns:IGescom">
      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 
    - <operation name="Rechercher_Plan_Analytique">
      <soap:operation soapAction="urn:GescomIntf-IGescom#Rechercher_Plan_Analytique" style="rpc" /> 
    - <input message="tns:Rechercher_Plan_Analytique0Request">
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:GescomIntf-IGescom" /> 
      </input>
    - <output message="tns:Rechercher_Plan_Analytique0Response">
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:GescomIntf-IGescom" /> 
      </output>
      </operation>
      </binding>
    - <service name="IGescomservice">
    - <port name="IGescomPort" binding="tns:IGescombinding">
      <soap:address location="http://localhost/HELLOWORLD/Pgescom.dll/soap/IGescom" /> 
      </port>
      </service>
      </definitions>

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    change ton PLAN_ANALYTIQUE
    Utilise des property en published au lieu de méthode, je ne crois pas qu'il mappe cela dans le WSDL

    Sinon Private et Published, tu n'es pas obligé de les répeter, cela délimite une section

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      PLAN_ANALYTIQUE = Class(TRemotable)
      private
        Fcode_analytique:String;
        Flibelle:String;
        FlibelleCourt:String;
     
      published
        property code_analytique: String read Fcode_analytique write Fcode_analytique;
        property libelle: String read Flibelle write Flibelle;
        property libelleCourt: String read FlibelleCourt write FlibelleCourt;
      end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Test avec des propriétés
    J'ai fait comme indiqué par ShaiLeTroll, en remplaçant les get et put par des propriétés comme ci-dessous et celles-ci apparaissent bien dans le WSDL.
    Quand à la procédure GetCode_analytique, elle n'apparait pas. Est-ce que ce serait une limitation du générateur de WSDL delphi ?



    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
    { Interface invocable IGescom }
     
    unit GescomIntf;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns;
     
     
    Type
     
       	PLAN_ANALYTIQUE = Class;
     
    			PLAN_ANALYTIQUE = Class(TRemotable)
      		Private
              _code_analytique:String;
    				  _libelle:String;
    				  _libelle_court:String;
          Published
              property code_analytique : string read _code_analytique write _code_analytique;
              property libelle         : string read _libelle write _libelle;
              property libelle_court   : string read _libelle_court write _libelle_court;
              property libelle_court4   : string read _libelle_court write _libelle_court;
     
              function GetCode_analytique(): string;
     
    		  	End;
     
     
      { Les interfaces invocables doivent dériver de IInvokable }
      IGescom = interface(IInvokable)
      ['{28E05B14-C9A0-4FD6-8E59-4BC0E31D766C}']
     
      Function Rechercher_Plan_Analytique(aCode_Analytique:String): PLAN_ANALYTIQUE; stdcall;
     
        { Les méthodes de l'interface invocable ne doivent pas utiliser la convention }
        { d'appel par défaut ; stdcall est conseillée }
      End;
     
    implementation
     
     
     
      Function PLAN_ANALYTIQUE.GetCode_analytique(): string;
      Begin
        result := Self._code_analytique
      End;
     
    initialization
      { Les interfaces invocables doivent être recensées }
      InvRegistry.RegisterInterface(TypeInfo(IGescom));
     
      InvRegistry.RegisterReturnParamNames();
     
     
     
    end.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Je pense que c'est une limitation du SOAP en général !
    tu confonds les Opérations de Service et les Paramètres\Retour d'une Opération !
    Ce n'est pas comme le DCOM, on tu peux définir plusieurs interfaces les unes ayant des méthodes pouvant renvoyés les autres ...

    Pense qu'au final c'est un échange de XML entre le Client et le Serveur suite à l'appel d'une Opération (un XML de commande) et son Retour (un XML de Données)

    d'ailleurs, la sémantique des objets Delphi reprend cette idée de séparation entre les objets de données et les objets d'opérations
    IInvokable est la classe de base des interfaces invocables.
    Invoquer = c'est un terme équivalent de "Appel" de fonction

    TRemotable est la classe de base des classes qui peuvent être transmises comme des paramètres ou des valeurs de retour dans une application de services Web.

    Utilisez TRemotable comme une classe de base lorsque vous définissez une classe qui peut être employée pour des paramètres ou des valeurs de retour sur une interface invocable.
    Tu as les operation du service IGescomservice
    Etudie le WSDL, regarde comme c'est complexe la déclaration d'une opération qui défini ses entrées et sorties

    Si tes méthodes de PLAN_ANALYTIQUE ne sont que des accesseurs, cela s'utilise directement dans les property, tu peux écrire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    type
      PLAN_ANALYTIQUE = Class(TRemotable)
      Private
         _code_analytique:String;
         _libelle:String;
         _libelle_court:String;
     
         function GetCode_analytique(): string; // regarde dans le property !!!
     
      Published
        property code_analytique : string read GetCode_analytique write _code_analytique;
        property libelle         : string read _libelle write _libelle;
        property libelle_court   : string read _libelle_court write _libelle_court;
      End;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Classe non trouvée dans le classpath
    Par blecharlier dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 18/10/2011, 09h02
  2. Classes non existantes dans un projet
    Par java2dev dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 26/01/2011, 11h13
  3. Classes non visibles dans Default.aspx.cs.
    Par laurent_diep dans le forum C#
    Réponses: 4
    Dernier message: 09/08/2009, 22h24
  4. Réponses: 1
    Dernier message: 03/03/2007, 12h28
  5. Réponses: 8
    Dernier message: 03/01/2007, 09h22

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