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

Delphi Discussion :

WebServices Asynchrone


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut WebServices Asynchrone
    Bonjour à tous,

    J'espere trouver de l'aide auprès de vous, même si mon problème est un peu complexe à expliquer. Alors merci d'avance pour votre indulgence et votre patience.

    Je voudrais réaliser un web services qui une fois appeler par un site, ou autre, intéroge un serveur d'application avec les composant de Mr Benoit Piette Midware. Et renvoi donc un buffer en retour contenant les données.

    Mon probleme, c'est que l'envoie d'une commande par piette et asynchrone,
    On envoie un buffer contenant les infos + une functioncode. Et c'est ensuite un évenement qui est déclaneché pour la réponse.

    Or, dans mon cas, web service, j'appele une fonction qui enblobe le traitement et qui renvoie le résultat. Ce qui signifie qu'il faudrait que ceci soit synchrone.


    Pour resoudre mon probleme j'ai essayer de faire une boucle avec un booleen et un Application.ProccessMessage pour "écouter" l'évenement, et ainsi le laisser se déclancher, abaisser le boolean et me faire passer à la suite de ma fonction.
    Sauf que probleme, avec les webservices (ou plutot le serveur CGI que je veux crée) la variable Application ne contient pas de ProcessMessage..

    J'espere que je perdu personne en route.

    Ma question serait donc comment faire pour scruter l'évenement à l'interieur de ma fonction.. Ou sinon, dans le cas ou je pars sur la mauvaise voie :
    Comment réaliser un CGI qui recoie la demande par une procédure et qui renvoie le résultat par une autre procedure ?


    Merci beaucoup .


  2. #2
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Salut!
    Mon probleme, c'est que l'envoie d'une commande par piette et asynchrone,
    Pas du tout !!
    Tu disposes d'une commande synchrone et asynchrone.
    Par exemple : HttpCli1.Post et HttpCli1.PostAsync;
    Tu peux aussi réaliser ta propre boucle d'attente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HttpCli1.PostAsync;
     
    IsCompleted := False;
    Repeat
      Application.ProcessMessages;
      Sleep(100);
    Until(IsCompleted);
    IsCompleted est une variable globale mise à True avec l'événement RequestDone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Procedure TForm1.RequestDoneProc(Sender: TObject; 
      RqType: THttpRequest; ErrCode: Word);
    Begin
      IsCompleted := True;
    End;
    A noter que cela revient au même de faire :...puisque la fonction est bloquante. D'ailleurs, on l'utilise plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Try
      Httpcli1.Post;
    Finally
      IsCompleted := True;
    End;
    Citation Envoyé par jambonstar
    Sauf que probleme, avec les webservices (ou plutot le serveur CGI que je veux crée) la variable Application ne contient pas de ProcessMessage..

    J'espere que je perdu personne en route.
    Tu vois, c'est justement là que je ne comprend plus rien... Soit un peu plus explicite.
    Surtout, sépare bien ce que fait le serveur et ce que fait ton programme Delphi.

    ps : J'ai récemment réalisé un tutoriel pour exécuter des scripts PHP avec Delphi (ICS), à+

  3. #3
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Salut Sub0,

    J'avoue que mon premier post n'était pas très clair.

    Je vais tenter de mieux expliquer mon probleme.

    On me demande de réaliser une couche Web Service sur une structure existante.

    Côté serveur, il existe un serveur qui communique avec ses clients grace au TAppServer de la suite MidWare (et pas ICS)
    Le principe de ce composant est une liste de FunctionCode qui correspond à des ServerObjects.
    Lorsque qu'un client veux quelque chose, il envoie, grace à un TAppServClient (Midware) : une functioncode, un buffer contenant les parametres.

    Le serveur fait son petit calcul, et renvoie chez le client un buffer contenant le ou les resultat. Là, un event OnRequestDone est déclenché et le client peut lire les resultats.

    Tout ceci fonctionne grace aux composants ICS, on est d'accord.

    Du côté client, une procédure d'attente (comme tu me l'a montré) existe pour rendre tout ca bloquant. Pour cela on utilise un Application.ProcessMessages.

    Mon boulot là dedans c'est de faire un client CGI qui intéroge ce serveur qui traite le resultat et le renvoie à un client Web.

    Sauf que de ce que j'ai pu lire, un CGI-SOAP sous delphi contient des fonctions accessible depuis les clients Web, et à la fin de chaque appel de fonction le CGI se referme.

    Ce qui fait que tout ce passe dans la fonction. Tout : c'est l'appel du TAppServClient.Send avec le functioncode qui va bien et ses parametres.

    Mais je ne peux pas sortir de cette fonction, ainsi je ne peut pas intercepter le OnRequestDone qui me donne la réponse des calculs.

    J'espere que mon probleme est plus clair.. même si j'en doute.

    En fait au lieu d'une procedure Send + Evenement, il m'aurai fallu une fonction Send():Resultat;

    J'avais prévu en voyant ce probleme de faire une boucle d'attente, mais un CGI, contrairement à un exe classique n'a pas de fonction du style : Application.ProcessMessages.

    En fait ma question pourrait se résumer à existe-t-il un moyen de d'intercepter un événement sans sortir d'une fonction déjà en cours ?

    Merci de ton aide.

  4. #4
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Bizarre bizarre.

    Voilà, j'ai réussi a faire fonctionner le Application.processmessages en incluant l'unité Forms dans mon unité WebModule.

    Je dois dire que cette manipulation est à la base un bidouillage "du dernier espoir".

    Mais voilà ca fonctionne. Alors pour le moment ca fonctionne en local, donc je vais devoir mettre tout ca sur un serveur web et relancer la manip. Mais si quelqu'un pouvait m'expliquer ce que je fais de mal, parce que je ne comprend plus rien..

    Ca fonctionne alors forcement j'ai le coeur qui bas tres vite, mais est-ce que ca ne serait pas une bombe à retardement

    Je vous tiens au courant

  5. #5
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    ???

  6. #6
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Salut Sub0 le modo,

    ou pas telle est la question qu'on est en droit de se poser.

    Et pour y répondre je vais, pour le devoir de mémoire, faire un résumé et puis un envoi à Borland, et pourquoi pas un procés au tribunal de grande Instance des développeurs spoliés.

    Mon problème :

    Service Web => UNE fonction qui lance un traitement et qui renvoie le resultat.

    Traitement de mon Service Web => Requete IP entre les composants MidWare de Overbite.

    Fonctionnement de la Requete IP => Envoie... Attente... Réponse par le déclenchement d'un événement.

    Le probleme est là : Pour lire l'évenement, soit on sort de la fonction (impossible en ServiceWeb) soit on boucle avec un Application.ProccesMessages.

    Or le ServiceWeb est fourni par un serveur SOAP exe (CGI) :

    Variable Application est une instance de WebApplication et non TApplication fenétré. Et ProccesMessages n'existe donc pas.

    Solution : Ajouté l'unité Forms et ainsi acceder à la variable Application classique. Ensuite je peux faire ma tambouille comme je veux.


    Bon avec tout ça je pense qu'on peut dire que c'est

    Même si un jour mon CGI risque de me faire signe :

    Si tel est le cas, je rapplique ici avec mes potes :

    Et on te fait ta fête Sub0 :


    Voilà

  7. #7
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Ils sont fous ces développeurs !

    à+

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

Discussions similaires

  1. appel webservice asynchrone
    Par rafleboss dans le forum Développement iOS
    Réponses: 1
    Dernier message: 18/07/2013, 16h59
  2. WebService et client asynchrone
    Par xbru_ dans le forum Services Web
    Réponses: 2
    Dernier message: 19/01/2010, 15h55
  3. [Web Service] Consommer un WebService .Net depuis PHP en asynchrone
    Par Joooooon dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 02/04/2009, 16h15
  4. WebService Asynchrone et ASP.NET
    Par ostenhard dans le forum Services Web
    Réponses: 17
    Dernier message: 27/07/2007, 17h03
  5. [C# 2.0] Webservice Asynchrones
    Par steph49s dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 11/11/2006, 03h20

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