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 :

WebService / Soap / XmlError


Sujet :

Web & réseau Delphi

  1. #1
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut WebService / Soap / XmlError
    Bonjour à tous,
    Je reprends un projet débuté il y a quelques années pour mettre en oeuvre des améliorations. L'application est basée sur l'usage de HttpRio créé dynamiquement (sous Delphi Tokyo/VCL/Windows7).

    Dans le code suivant,
    fgetAllPhysicalIos et fgetAllPhysicalIosResponse sont déclarés et riServer2 est un serviceWeb crée à partir d'une entité WSDL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        fgetAllPhysicalIos := getAllPhysicalIos.create;
        try
          try
            (riServer2 as ISOAPHeaders).Send(riEnteteId);
            fgetAllPhysicalIosResponse := riServer2.getAllPhysicalIos (fgetAllPhysicalIos);
          except
            on E: EXMLDocError do
            begin
    ...
    avec
    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
     
    getAllPhysicalIos = class(TRemotable)
      private
      public
        constructor Create; override;
      published
    end;
     
    getAllPhysicalIosResponse = class(TRemotable)
      private
        Fdata: MimeData;
      public
        constructor Create; override;
        destructor Destroy; override;
      published
        property data: MimeData  Index (IS_UNQL) read Fdata write Fdata;
    end;
     
    et
     
    MimeData = class(TRemotable)
      private
        FcontentType: contentType;
        FcontentType_Specified: boolean;
        Fdata: TByteDynArray;
        procedure SetcontentType(Index: Integer; const AcontentType: contentType);
        function  contentType_Specified(Index: Integer): boolean;
      published
        property contentType: contentType    Index (IS_ATTR or IS_OPTN) read FcontentType write SetcontentType stored contentType_Specified;
        property data:        TByteDynArray  Index (IS_UNQL) read Fdata write Fdata;
    end;
    Au moment de l'appel de getAllPhysicalIos j'ai systématiquement le défaut
    EXMLDocError : L'élément "data" ne contient pas un noeud texte unique alors que la réponse (stream) est correct et complète.

    et une fuite mémoire liée à la non destruction certains objets (getPhysicalIoResponse et le Mimedata) :
    Nom : SoapFuiteMemoire.PNG
Affichages : 325
Taille : 23,8 Ko

    Je ne trouve pas de solution gérer le MimeData (probablement la cause du défaut et de la fuite mémoire).
    Merci pour votre aide,
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Parfois, le code généré n'est pas parfait niveau libération dans le destructor, je te laisse vérifier si Fdata est bien libéré

    Tu ne montres pas le finally associé au try du create, c'est pourtant là que se trouve la solution

    Curieusement, fgetAllPhysicalIosResponse semble alloué malgré l'exception, il doit falloir le libérer, probablement directement dans le code généré de getAllPhysicalIos qui en cas d'exception doit libérer son Result et propager tout de même l'exception
    Toujours ce problème de code généré qui n'est pas toujours top propre


    Pour ton erreur XML, en D7 j'avais bidouillé pour utiliser un WS Biztalk pour envoyer un XML qui ne soit pas géré comme un nœud SOAP
    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
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Merci Shai le Troll.
    Tu m'avais déjà aidé à la création de cette appli, pour améliorer le code et j'ai beaucoup progressé mais je dois arriver à passer cette étape pour la nouvelle version.

    La libération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        finally
          fgetAllPhysicalIos.Free;
        end;
    Si j'ajoute un fgetAllPhysicalIosResponse.Free, je génère un défaut d'affichage (??!!) avec la disparition du tButton qui me sert à déclencher, en test, la requète... et le fgetAllPhysicalIosResponse n'est pas libéré.
    J'ai aussi tenté de le créer, pour pouvoir le libérer mais, j'ai toujours le même résultat.

    Il me semble que c'est ce défaut de noeud qui engendre ces conséquences.

    Je n'ai pas trouvé accès à ta bidouille.

    Merci pour votre aide,
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Galet Voir le message
    Si j'ajoute un fgetAllPhysicalIosResponse.Free, je génère un défaut d'affichage (??!!) avec la disparition du tButton qui me sert à déclencher
    C'est typique d'une non-initialisation
    fgetAllPhysicalIosResponse contient une valeur mémoire au pif, et souvent c'est le Sender, le Button

    le code doit être

    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
     
    begin
        fgetAllPhysicalIos := getAllPhysicalIos.create;
        try
          try
            (riServer2 as ISOAPHeaders).Send(riEnteteId);
            fgetAllPhysicalIosResponse := riServer2.getAllPhysicalIos (fgetAllPhysicalIos);
            try   
              // utlisation de fgetAllPhysicalIosResponse 
            finally
              fgetAllPhysicalIosResponse.Free();  
            end;
          except
            on E: EXMLDocError do
            begin
              ... 
              raise;
            end;
          end;
        finally
          fgetAllPhysicalIos.Free();
        end;
     
    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
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Merci pour ton éclairage....
    Je teste ça dès que possible.
    Cordialement
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  6. #6
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Bonjour,

    Suite à l'essai, toujours les mêmes défauts :
    - l'exception est générée à l'appel de : fgetAllPhysicalIosResponse := pRobotTmp.riServer2.getAllPhysicalIos(fgetAllPhysicalIos);
    - fgetAllPhysicalIosResponse et mimeData ne sont pas libérés.


    Je vais donc essayer de trouver une solution dans le WSDL.

    Si vous avez une autre idée, je suis preneur, sinon, je vais reculer (une seconde fois) pour revenir au code précédent (en oubliant les nouvelles fonctionnalités espérées).
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  7. #7
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Bonjour,
    J'ai récupéré du fournisseur du service Web, un exemple de codage en C# :
    Code c# : 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
            private void m_btnServer2_GetPhysicalIOs_Click(object sender, EventArgs e)
            {
                if (m_sessionId < 0) return;
     
                m_server2ListboxIo.Items.Clear();
                m_physicalLinks = null;
     
                // Retrive Physical links from IO list
                MimeData l_mimeData = m_cs8ServerV2.getAllPhysicalIos(m_sessionId);
                if (l_mimeData != null)
                {
                    MemoryStream l_msMime = new MemoryStream(l_mimeData.data);
                    StreamReader l_reader = new StreamReader(l_msMime);
                    XmlDocument l_xDocument = new XmlDocument();
                    l_xDocument.Load(l_msMime);
                    XmlNodeList l_nodelist = l_xDocument.GetElementsByTagName("Io");
                    m_physicalLinks = new string[l_nodelist.Count];
                    for (int l_i = 0; l_i < l_nodelist.Count; ++l_i)
                    {
                        XmlNode l_node = l_nodelist[l_i];
                        m_physicalLinks[l_i] = l_node.Attributes["name"].Value;
                        m_server2ListboxIo.Items.Add(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} | {1} | {2}", m_physicalLinks[l_i], l_node.Attributes["desc"].Value, l_node.Attributes["type"].Value));
                    }
                }
            }

    Il semble que les options de l'importateur WSDL ne configurent pas ma procédure getAllPhysicalIOs de la même manière.

    J'ai commencé à faire varier les options de l'importateur mas ne trouve pas la bonne configuration.
    Voici ma configuration actuelle :
    Nom : Capture.PNG
Affichages : 266
Taille : 29,7 Ko

    Avez-vous une idée ?
    Merci par avance,
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  8. #8
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Bonjour à tous,
    Après avoir tenté une multitude de configurations différentes, je ne trouve pas de solution traduisant la fonction attendue sous la forme
    "MimeData l_mimeData = m_cs8ServerV2.getAllPhysicalIos(m_sessionId);" du C#
    Je dois louper une étape...
    Merci pour vos idées,
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    C'est bien le problème du SOAP
    Il y a les partisans du Document/Literal et ceux du RPC/Encoded
    C'est une plaie de faire en sorte que cela se comprenne
    Il faut parfois modifier le WSDL à la main pour l'importer ou alors modifier le code généré tout en laissant des options contradictoires qui combinées génèrent un truc qui fonctionne mais en théorie non supporté par Delphi
    C'est uniquement par tâtonnement que tu y arriveras
    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

  10. #10
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Merci ShaiLeTroll, même si je rêvais d'une réponse du style "Regarde bien, il suffit de..."
    Je vais suivre tes conseils...et tâtonner.
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  11. #11
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Après de nombreux tests, j'ai enfin trouvé une configuration qui règle une bonne partie des défauts :
    - Procédures assez similaires à celles de C#
    - Fuite mémoire presque nulle et surtout indépendante du nombre de requêtes Soap

    J'ai toujours le défaut de Nœud unique soap à la réponse mais arrive à analyser le fichier.

    Au cas où, voici la configuration pour interpréter le fichier WSDL :
    Nom : ParametresWSDL.PNG
Affichages : 234
Taille : 124,4 Ko

    Merci à ShaiLeTroll pour tes conseils...
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/09/2009, 10h02
  2. [Web Service] Appel Webservice SOAP
    Par HaTnuX dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 16/08/2008, 22h33
  3. webservices soap et php
    Par manuscle dans le forum WinDev
    Réponses: 0
    Dernier message: 16/04/2008, 16h35
  4. Réponses: 1
    Dernier message: 13/02/2007, 17h43
  5. Webservice SOAP et fichier attaché ?
    Par Bruno13 dans le forum Services Web
    Réponses: 13
    Dernier message: 03/04/2006, 17h36

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