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

Silverlight Discussion :

silverlight et service wcf


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut silverlight et service wcf
    bonjour,
    j'ai un service wcf qui me retourne un string qu'il récupere depuis une base de donnée.
    ces string je les affiche dans des TextBlock. ne pouvant pas ecrire un service pour chaque TextBlock, j'ai procedé comme suit:
    je crée une variable temporaire où je stocke le résultat retourné par mon service (e.result)
    je retourne cette variable juste après l'appel à mon service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string message;
    public string chargerMessage(int idMessage)
            {
               chargerMsgByWCF(idMessage);            
               return message;            
          }

    mais ça ne fonctionne pas à cause du fait que les appels sont asynchrones.

    des idées sur comment faire?
    merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est pas très clair ton histoire... on peut voir le contrat de ton service WCF ?

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    je m'attendais à ce que ça ne soit pas clair , le contrat de mon service est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
             public string chargerMessage(int idMsg)
             {
                 var msg = db.DOCUMENTATIONS.Single<DOCUMENTATIONS>(d => d.ID_DOC == idMsg);
                 return msg.CORPS;
             }
    mon service me retourne donc le texte à afficher dans un textBlock. J'ai plusieurs textBlock et je veux écrire une fonction générique qui reçoit l'identifiant d'un message et me retourne son corps.

    j'appelle mon service via la fonction chargerMsgByWCF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void chargerMsgByWCF(int idMessage)
            {          
                message="";
                client.MessageCompleted+=new EventHandler<Accueil.ServicesBDReference.MessageCompletedEventArgs>(client_MessageCompleted);
                 client.MessageAsync(idMessage);
     
            }
    et je stocke le resultat dans message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            void client_MessageCompleted(object sender, Accueil.ServicesBDReference.MessageCompletedEventArgs e)
            {
               message= e.Result;            
            }
    mais on appellant chargerMessage(int idMessage) dont la definition est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public string chargerMessage(int idMessage)
            {
               chargerMsgByWCF(idMessage);            
               return message;            
          }
    je n'ai le retour attendu à cause de l'asynchronisme des appels

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est pas ça le contrat... ce que je voulais voir, c'était l'interface du service, l'interface de callback, les attributs WCF qui définissent le comportement, etc...

    Enfin bref, si la méthode du service est asynchrone, tu ne peux pas faire une méthode synchrone pour en récupérer le résultat... à moins d'attendre que l'opération asynchrone soit terminée en faisant un poll sur le IAsyncResult renvoyé par client.MessageAsync, mais si tu fais ça, autant rendre synchrone la méthode du service, puisque tu n'exploites pas le fait que ce soit asynchrone...

    Petite remarque en passant : si tu ajoutes un handler pour MessageCompleted à chaque fois que tu appelles la méthode Message, tu vas finir par avoir plein de handlers sur cet évènement, et donc ça va être de plus en plus lent (sans parler des dysfonctionnements que ça va engendrer...). Il faut ajouter le handler une seule fois, lors de l'initialisation du client par exemple

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 23
    Par défaut
    comment je pourrai rendre la méthode du service synchrone?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    peut-être en appelant Message et non MessageAsync...

    en fait la méthode n'est sans doute pas intrinsèquement asynchrone, mais là tu appelles sa forme asynchrone (suffixe Async)

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par goubidik Voir le message
    comment je pourrai rendre la méthode du service synchrone?
    Tous les appels de service en Silverlight se font de manière asynchrone.
    De toute façon une fois que tu as ajouté la référence sur ton service dans ton projet Silverlight, quand tu instancies la classe de ton service, y'a que des méthodes asynchrone.

    Il ne faut pas oublier de créer un Silverlight-enabled WCF service (template que d'ailleurs je n'ai pas chez moi ).

Discussions similaires

  1. Silverlight et service WCF asynchrone
    Par fterf dans le forum Silverlight
    Réponses: 13
    Dernier message: 17/09/2011, 18h22
  2. Silverlight et service WCF hebergé dans console
    Par matdur dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 15/06/2010, 16h04
  3. Service WCF, Silverlight et taille des objets
    Par Steven62 dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 18/08/2009, 10h57

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