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 :

Web service delphi et Vb.net


Sujet :

Web & réseau Delphi

  1. #1
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut Web service delphi et Vb.net
    Bonjour

    J'ai développé un Web service sous XE2 et un client sous XE2 et tout fonctionne parfaitement.

    Par contre ce Web service doit être utilisé par des tierces qui travaillent sous VB.net.

    Ils rencontrent des problèmes lors de l'appel à certaine fonction, sûrement à cause des paramètres. Car les appels sans paramètre s'exécutent correctement sous vb.net.

    Les paramètres passés sont parfaitement reçu par mon web service, la fonction qu'ils attaquent se déroule parfaitement, mais au retour ils obtiennent un message leur indiquant qu'il y a une erreur dans le XML.

    Les params sont pourtant basique, string et integer. Pas de tableau ou autre.
    Par contre les params sont passés sous forme de record:

    Tpar = record
    chaine1: string;
    chaine2: string;
    value: integer;
    end;

    function test(var par: Tpar): integer; sdtcall;

    Avez vous déjà rencontré ce genre de problème ?
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  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
    Delphi en WebService SOAP, c'est souvent du RPC-encoded comme je l'évoquais dans le sujet service web non décrit ?

    Chez MS, c'est document-literal, voir la MSDN - Problèmes avec les messages RPC/Encoded

    Cependant, si vous ne contrôlez pas le service Web que vous voulez utiliser et que vous devez vous connecter à un service Web utilisant le style RPC/codé, vous pouvez utiliser un service de proxy .NET (.NET Proxy Service) pour vous y connecter.

    J'ai plutôt fait des clients Delphi de WS PHP, en bidouillant le WSDL ou en jouant sur les options de WSDLImp de Delphi, on arrive a utiliser du document-literal sans soucis et à y répondre, le PHP arrive a comprendre le literal ou l'encoded sans qu'on lui précise

    Pour le .NET, cela a toujours été la galère et certains dev.NET contournaient cela avec des ANY contenant un XML (j'ai vu plusieurs WS contournant les specs .NET en utilisant qu'un seul paramètre non typé ANY), encore une fois, j'étais Client
    Le Dev.NET avait fait ce choix du ANY dans BizTalk car cela simplifié l'Interop avec Java et PowerBuild

    Par contre, en Serveur, le client DOIT s'adapter et MS a abandoner le RPC-encoded, je crois qu'il ne le supporte plus du tout et utilise un Proxy ASP.NET (IIS) qui fait l'intermédiaire entre le client VB.NET et le WS RPC-encoded

    Voir aussi Free Pascal Web Service ToolKit permettant plus de chose que le SOAP Delphi

    Certains membres en bidouillant le SOAP généré ont peut-être réussi des choses : Changer le format dans 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 actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Ok Shai,

    on y est arrivé d'une autre façon:
    function test(par: Tpar): Tpar; sdtcall;

    en supprimant le var de la classe en entrée et en retournant la classe.

    Ce qui m'ennui, c'est que le result de cette fonction (Tpar), c'est moi qui le crée
    sur mon web service, mais comment libérer la mémoire suite au create ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function test(par: Tpar): Tpar;
    begin
           result:= Tpar.Create;
           /.....
           ..../
           result.chaine1:= 'tagada';
           result.chaine2:= 'tigidi';
          //mais je ne peux faire un FreeAndNil(Result) , 
          //sinon le client ne va rien recevoir !
     
    end;
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  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
    Ah, oui, les paramètres de retour, je n'avais pas fait attention, c'est l'inverse du COM, si c'est plus élégant de faire des paramètres de retour + HRESULT (typique en C++Builder simplifié en Safecall en Delphi)

    En SOAP, faut mieux éviter car cela utilise les trucs qui diffère dans le RPC-Encoded du SOAP 1.0 et SOAP 1.1 !

    Normalement, un objet TRemotable envoyé de cette façon au Marshaller sera libéré par le Marshaller !

    C'est surtout côté client, ou en Delphi, il faut gérer ses libérations avec soin !
    un Client doit libérer les paramètres qu'il a fourni et il est aussi responsable de la libération de valeur retournée lors du unmarshalling de la réponse SOAP

    Citation Envoyé par aide TRemotable
    L'appelant d'une interface invocable (client) est responsable de la création de toute instance de TRemotable qu'il transmet en paramètre d'entrée, et de la libération de toute instance de TRemotable qu'il crée ou qui est renvoyée sous la forme de paramètres de sortie ou de résultats de méthode.
    côté Server, il n'y a rien à faire, toutes les instances sont gérés par le Marshaller, du moins c'est ce que je comprends de :

    Citation Envoyé par aide TRemotable
    Dans les applications serveurs, les instances de TRemotable utilisées comme paramètres d'entrée d'une interface invocable sont créées automatiquement lorsque l'appel de méthode est désassemblé et sont libérées automatiquement quand des paramètres de sortie ou une valeur renvoyée sont assemblés afin d'être envoyées au xclient. Quand un descendant de TRemotable est créé dans une méthode qui a été appelée à distance par le biais d'une interface invocable, l'instance est automatiquement libérée après le marshaling de la valeur du descendant de TRemotable pour le transport vers l'application client.
    Active ReportMemoryLeakOnShutDown de ton Delphi XE2, si tu veux être tranquille à ce sujet

    à la fin du DPR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...  Application.Run;
     
    {$IFDEF DEBUG}
    {$WARN SYMBOL_PLATFORM OFF}
      System.ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    {$WARN SYMBOL_PLATFORM ON}
    {$ELSE DEBUG}
      System.ReportMemoryLeaksOnShutdown := False;
    {$ENDIF DEBUG}
    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 actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Active ReportMemoryLeakOnShutDown de ton Delphi XE2, si tu veux être tranquille à ce sujet

    à la fin du DPR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...  Application.Run;
     
    {$IFDEF DEBUG}
    {$WARN SYMBOL_PLATFORM OFF}
      System.ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    {$WARN SYMBOL_PLATFORM ON}
    {$ELSE DEBUG}
      System.ReportMemoryLeaksOnShutdown := False;
    {$ENDIF DEBUG}
    end.
    Oui, c'est une bonne idée, sauf que ça ne marche pas avec un ISAPI, qui est une DLL chargée par IIS et qui est déchargée quand tu arrêtes IIS...

    Mais merci, j'avais pas pensé à l'aide de Tremotable.
    Je vais éplucher de ce coté pour bien piger le truc.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  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
    Pour ReportMemoryLeaksOnShutdown, faudrait voir avec la version complète de FastMM peut générer un Fichier comme le fait CodeGuard pour C++Builder au lieu d'un MessageBox !
    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. Récupérer le login IIS dans un web service delphi
    Par [DreaMs] dans le forum Web & réseau
    Réponses: 0
    Dernier message: 17/11/2009, 10h59
  2. Probléme de déploiement d'un web service Delphi
    Par nidou01 dans le forum Web & réseau
    Réponses: 0
    Dernier message: 09/07/2009, 12h51
  3. je trouve asp.net web service mais pas asp.net web application
    Par question87 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 22/04/2008, 21h26
  4. Réponses: 5
    Dernier message: 17/01/2008, 13h18

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