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

Services Web Discussion :

Création d'un service WCF Duplex


Sujet :

Services Web

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par défaut Création d'un service WCF Duplex
    Salut à tous ceux qui lisent ces lignes !

    Voilà, je découvre tout doucement la technologie WCF qui j'avoue est un poil supérieur à celle des web services classiques et autant créer un service web classique (un client appelle et exécute des fonctions sur le service), autant je n'arrive pas à créer un service en duplex (le client peut exécuter des méthodes du service et le service des méthodes du client) ou bien à correctement configurer le client.

    Pour mon test j'ai créé un client et service en duplex. Le client appelle une méthode sur le service qui elle-même appelle une méthode sur le client (pour vérifier que l'aller comme le retour fonctionne).
    Le souci c'est que j'ai un timeout au moment où le service souhaite executer la méthode sur le client.

    Et si vous êtes déterminé à me répondre, voilà l'interface et celle du callback, le service qui l'implémente et le fichier de conf du service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    namespace DuplexServer
    {
        [ServiceContract(CallbackContract = typeof(IClientCallbackContract))]
        public interface IServerContract
        {
            [OperationContract]
            void SayHelloFromServer();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    namespace DuplexServer
    {
        [ServiceContract]
        interface IClientCallbackContract
        {
            [OperationContract]
            void ReceiveHello();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    namespace DuplexServer
    {
        [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
        public class ServerTest : IServerContract
        {
            public void SayHelloFromServer()
            {
                IClientCallbackContract Client = OperationContext.Current.GetCallbackChannel<IClientCallbackContract>();
                Client.ReceiveHello();
            }
        }
    }
    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
     
    <?xml version="1.0"?>
    <configuration>
     
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
        <services>
          <service name="DuplexServer.ServerTest">
            <endpoint binding="wsDualHttpBinding"
              bindingConfiguration="" name="WsDualHttpBinding" contract="DuplexServer.IServerContract" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
              <serviceMetadata httpGetEnabled="true"/>
              <!-- 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>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
     
    </configuration>
    Et maintenant le côté client (oui je sais ça fait un long post désolé...) :
    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
     
    namespace DuplexClient
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window, IServerContractCallback
        {
            DuplexClient.ServiceReference1.ServerContractClient service = null;
     
            public MainWindow()
            {
                InitializeComponent();
     
                service = new ServerContractClient(new System.ServiceModel.InstanceContext(this));
            }
     
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                service.SayHelloFromServer();
            }
     
            public void ReceiveHello()
            {
                MessageBox.Show("Message déclanché par le 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
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <wsDualHttpBinding>
                    <binding name="WsDualHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                        receiveTimeout="00:01:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                        transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <reliableSession ordered="true" inactivityTimeout="00:01:00" />
                        <security mode="Message">
                            <message clientCredentialType="Windows" negotiateServiceCredential="true"
                                algorithmSuite="Default" />
                        </security>
                    </binding>
                </wsDualHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:3284/ServerTest.svc" binding="wsDualHttpBinding"
                    bindingConfiguration="WsDualHttpBinding" contract="ServiceReference1.IServerContract"
                    name="WsDualHttpBinding">
                    <identity>
                        <userPrincipalName value="jmauperi@corp.capgemini.com" />
                    </identity>
                </endpoint>
            </client>
        </system.serviceModel>
    </configuration>
    Je précise que j'ai générer les fichier de conf via WCF configuration editor, qui celà dit, semble très bien marcher...

    Merci d'avance à tous ceux qui pourront m'aider, j'ai encore pas mal de difficultés à configurer ces web services (ConcurrencyMode, InstanceContextMode, c'est encore obscure un peu pour moi :p...)

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Peut être une intuition:
    Lors de ton fonctionnement, côté serveur lorsque tu executes SayHelloFromServer le client attend le retour de cette fonction pour liberer le canal (même si la fonction retourne void, il y'aura un accusé de reception soap renvoyé derriere). Du coup quand côté serveur tu essaies d'acceder au client, ca ne peut pas fonctionner, le client n'écoute pas. Il faut que tu ajoutes IsOneWay=true aux deux attributs OperationContract

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par défaut
    Je teste ça direct !

    EDIT : Ça marche ! J'avoue que j'avais légèrement songé à la chose mais je ne pensais pas que ce serait bloquant et quand bien même je n'aurai pas su le gérer.
    En tout cas c'est cool, ça fonctionne maintenant. Si jamais tu peux résumer en une phrase l'utilité du IsOneWay je veux bien si ça te dérange pas. J'irai me renseigner dessus de toute façon.

    Encore merci !

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Lorsque IsOneWay est à false, l'émetteur s'attends à recevoir un accusé de reception soap confirmant l'arrivée du message.
    Lorsqu'il est à true, le message est envoyé et peu importe ce qu'il s'y passe (si personne ne le recoit par exemple) il continue son chemin.
    Outre les communications duplex, il sert aussi dans le cas de communications peer to peer.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2011, 00h26
  2. Service Web Duplex WCF + Silverlight
    Par Advance_ dans le forum Services Web
    Réponses: 3
    Dernier message: 11/02/2011, 22h45
  3. Asynchro dans un service WCF Duplex
    Par Z4ng3tsu dans le forum Services Web
    Réponses: 3
    Dernier message: 14/05/2010, 13h41
  4. [WebService]Création de Web Services
    Par cazaux dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 02/03/2006, 20h21
  5. Création d'un service windows
    Par t_om84 dans le forum Général Python
    Réponses: 3
    Dernier message: 01/12/2005, 17h04

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