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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    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 : 325
    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 : 373
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,

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    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 expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    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 : 325
    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,

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    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 expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    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 : 325
    Par défaut
    Merci pour ton éclairage....
    Je teste ça dès que possible.
    Cordialement

  6. #6
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    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 : 325
    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).

+ 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