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

Windows Communication Foundation .NET Discussion :

Communication Serveur Client


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut Communication Serveur Client
    Bonjour.
    J'aurais souhaité avoir quelques précisions sur la communication entre les parties client et serveur.
    D'un coté, j'ai donc ma partie serveur (qui se trouve etre un service windows) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    ServiceWCFInterface wService = new ServiceWCFInterface (FThreads);
    FInterfaceHost = new ServiceHost(wService); 
    FInterfaceHost.Open();
    ...
    et de l'autre, mon IHM qui fait office de client, où à sa création je retrouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    channelFactory = new ChannelFactory<IInterfaceService>("ServicesWCF.ServiceWCFInterface");
    channelFactory.Open();
    InterfaceServiceWCF = channelFactory.CreateChannel();
    ...
    et ensuite, je peux appeler InterfaceServiceWCF.MesDifférentesMethodes() pour récupérer les infos dont j'ai besoin sur le service.

    Ceci fonctionne bien, mais maintenant, j'aimerais renvoyer une réponse au service au cas où mon IHM modifierait certaines valeurs qu'il a récupéré via le channel.

    Et c'est là que je coince. J'ai cru comprendre qu'il fallait utiliser le callback mais je ne vois pas bien comment dans mon cas.

    Quelqu'un pour me mettre sur une bonne piste svp ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Je ne comprends pas bien : si tu veux que ton client envoie quelque chose au service , tu appelles la méthode qui va bien.

    Concernant les "Callback", je pense que tu fais références aux contrats "duplex", mais ça sert exactement à faire le contraire : permettre au serveur d'appeler une méthode sur le client.

    Précise un peu ce que tu veux faire.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Dans mon IHM, j'appelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InterfaceServiceWCF.GetMesObjets();
    qui me renvoit la liste de mes objets qui sont actifs (au démarrage, le service scrute dans la base de données ceux qui le sont, et lance des threads en conséquence).
    Dans la fenetre de mon IHM, je peux activer/desactiver ces objets, ce qui doit avoir pour répercussion de stopper les threads correspondants. Je peux aussi ajouter un objet à ma BDD, et donc dire au service de lancer un nouveau threads.

    Perso, je pensais créer une nouvelle interface, et faire la meme chose dans l'autre sens en fait (créer un channel dans ma partie "Service" et appeler les methodes qu'il faut) Mais j'ai l'impression que ca fera un peu doublon non? (puisque la partie IHM et Service seront à la fois Client et Serveur)

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par ElBarto38 Voir le message
    Dans mon IHM, j'appelle:

    Perso, je pensais créer une nouvelle interface, et faire la meme chose dans l'autre sens en fait (créer un channel dans ma partie "Service" et appeler les methodes qu'il faut) Mais j'ai l'impression que ca fera un peu doublon non? (puisque la partie IHM et Service seront à la fois Client et Serveur)
    Ce que tu décris est typiquement l'usage d'un contrat Duplex.

    - le client initie la communication
    - le client apelle (ou pas) des méthodes sur le serveur.
    - le serveur apelle des méthodes sur le client, en récupérant l'interface "callback" fournie par le client.

    Regarde sur le MSDN le chapitre "How to create a duplex contract" et "How to access service with a duplex contract".

    C''est très bien expliqué. (les exemples que j'ai sous la main sont un peu trop complexes pour les poster ici, il faudrait trop de temps pour les "toiletter").

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Ok! Je vais y jeter un oeil!
    Merci pour la rapidité de la réponse

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    "The underlying channel factory could not be created because no binding was passed to the ChannelFactory. Please supply a valid Binding instance via the ChannelFactory constructor"

    J'ai gagné le droit d'aller bidouiller le fichier de config je crois.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Je crois que tu as en effet gagné ce droit.

    dans la version initiale, tu spécifies tes bindings dans le fichier de config ou via le code ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Fichier de config:
    Serveur
    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
     
      <system.serviceModel>
        <bindings>
          <netTcpBinding>
            <binding name ="NoSecurity">
              <security mode="None"/>
            </binding>
          </netTcpBinding>
        </bindings>
        <services>
          <service name="Test.ServicesWCF.ServiceWCFInterface">
            <endpoint contract="Test.Librairie.LibrairieWCF.IInterfaceService"
                      binding="netTcpBinding"
                      bindingConfiguration="NoSecurity"
                      address="net.tcp://localhost:5910/Test/Service"/>
          </service>
        </services>
     
        <behaviors>
          <serviceBehaviors>
            <behavior name="Test.ServiceEntrant.ServiceEntrantBehavior">
     
              <!-- To receive exception details in faults for debugging purposes, 
              set the value below to true.  Set to false before deployment 
              to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="true" />
     
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    Client
    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
     <system.serviceModel>
        <bindings>
          <netTcpBinding>
            <binding name ="NoSecurity"
              <security mode="None"/>
            </binding>
          </netTcpBinding>
        </bindings>    
        <client>
          <endpoint name="Test.ServicesWCF.ServiceWCFInterface"
                    contract="Test.Librairie.LibrairieWCF.IInterfaceService"
                    binding="netTcpBinding"
                    bindingConfiguration="NoSecurity"
                    address="net.tcp://localhost:5910/Test/Service"/>
        </client>
        <behaviors>
          <serviceBehaviors>
            <behavior name="Test.ServiceEntrant.ServiceEntrantBehavior">
     
              <!-- To receive exception details in faults for debugging purposes, 
              set the value below to true.  Set to false before deployment 
              to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="False" />
     
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Houlà, au temps pour moi, rien à voir: J'avais oublié de changer les parametres en passant de ChannelFactory au DuplexChannelFactory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    channelFactory = new DuplexChannelFactory<IInterfaceService>(new InstanceContext(this), "Test.ServicesWCF.ServiceWCFInterface");
    Avec new InstanceContext(this), c'est mieux

    Encore quelques tests à faire, et j'pense que j'pourrais passer ce topic en résolu. Merci beaucoup

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Arf, petit souci sur cette ligne:
    FCallback = OperationContext.Current.GetCallbackChannel<IInterfaceServiceCallBack>();

    OperationContext.Current est null ...

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bon, tu as avancé, visiblement.

    A quel endroit de ton code appelle tu OperationContext.Current ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Sur le OnStart() de mon service, je lance mon IHM (le processus client donc). Et ensuite, j'ai çà un peu plus loin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FMonServiceHost.Open(); 
    FCallback = OperationContext.Current.GetCallbackChannel<IInterfaceServiceCallBack>();

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Ok, je vois ton problème, du à une mauvaise compréhension du mécanisme des duplex contracts.

    En effet, la récupération du callback ne peut se faire qu'une fois que le client a appelé une méthode sur le serveur (sinon, on ne voit pas très bien comment le serveur pourrait avoir connaissance de l'instance de callback, puisque le client n'ayant pas connecté le serveur, ce dernier n'est pas informé de l'instance de callback).

    La séquence typique est la suivante :

    - init serveur
    - init client
    - client apelle Method1 sur le serveur
    - dans le code de Method1, le serveur récupére le callback du client, et le "met de coté".

    A ce stade, la communication duplex est initialisée.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  14. #14
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    - init serveur
    Ok

    - init client
    Pas de probleme

    - client apelle Method1 sur le serveur
    J'veux bien

    - dans le code de Method1, le serveur récupére le callback du client, et le "met de coté".
    Euuuuuuuuuh Ma Method1 ressemblera donc à ca si j'comprends bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void Method1()
    {
    ...
      FCallback = OperationContext.Current.GetCallbackChannel<IInterfaceServiceCallBack>();
    ...
    }
    mais j'comprends pas bien ce que le serveur en fera apres et comment il y accède surtout. Faut que je rappelle OperationContext.Current.GetCallbackChannel<IInterfaceServiceCallBack>(); dans le serveur ?

  15. #15
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par ElBarto38 Voir le message
    -mais j'comprends pas bien ce que le serveur en fera apres et comment il y accède surtout. Faut que je rappelle OperationContext.Current.GetCallbackChannel<IInterfaceServiceCallBack>(); dans le serveur ?
    Ben là, ou on s'est pas compris, ou ....


    En effet, IInterfaceServiceCallBack n'a d'utilité que pour le serveur (le client n'a pas l'usage d'une interface qu'il implémente : il ne va pas s'appeler lui même).

    le client spécifie son interface de callback quand il ouvre sa comm vers le serveur.

    le serveur récupère cette interface et s'en sert si il doit rappeler le client. (bien entendu les interfaces callback n'ont d'utilité que si le serveur doit contacter le client à sa propre initiative; à l'inverse pour le retour d'info serveur -> client à l'initiative du client, ben, le retour des méthodes suffit, non ? et dans ce cas, les contrats WCF non-duplex suffisent amplement)

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

Discussions similaires

  1. Comment tester la communication Serveur/Client
    Par codon21 dans le forum VB.NET
    Réponses: 2
    Dernier message: 09/02/2010, 16h29
  2. Problème communication serveur/client avec Socket
    Par Nicolas74 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 03/12/2009, 16h54
  3. bug communication Serveur/Client - Indy10 (avec D2009) !
    Par djiga4me dans le forum Web & réseau
    Réponses: 2
    Dernier message: 21/11/2009, 00h46
  4. Web Services - Problème de communication serveur/client
    Par vern's dans le forum Web & réseau
    Réponses: 9
    Dernier message: 27/08/2007, 10h06
  5. [servlet][http] communication serveur/client
    Par amel666 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 03/02/2006, 07h05

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