43 votes

Quelles étapes dois-je suivre pour utiliser les Callbacks WCF ?

J'essaie d'apprendre le WCF. J'ai une application client-serveur simple et, lorsque le client appuie sur un bouton, il reçoit une valeur actualisée du serveur.

La prochaine étape est que j'essaie de faire un callback du serveur vers le client pour mettre à jour sa valeur. J'ai parcouru de nombreux exemples, mais ils me semblent trop volumineux et confus. Quelqu'un peut-il me donner l'exemple le plus simple de sa mise en œuvre en C# ?

Je continue à regarder les exemples en ligne et je ne comprends pas ce qu'il faut faire ? Bien sûr, je pourrais copier l'exemple ligne par ligne mais cela ne me sert à rien car je ne sais toujours pas ce qu'il faudrait mettre en œuvre si je voulais faire cela dans mon propre code.

Quelqu'un pourrait-il m'aider en me donnant un exemple très simple des étapes à suivre et de ce que je dois faire dans le code du serveur puis dans le code du client pour que cela se produise ?

Merci.

85voto

Ray Vernagus Points 4276

Voici l'exemple complet le plus simple que je puisse trouver :

public interface IMyContractCallback
{
    [OperationContract]
    void OnCallback();
}

[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
public interface IMyContract
{
    [OperationContract]
    void DoSomething();
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyContract
{
    public void DoSomething()
    {
        Console.WriteLine("Hi from server!");
        var callback = OperationContext.Current.GetCallbackChannel<IMyContractCallback>();
        callback.OnCallback();
    }
}

public class MyContractClient : DuplexClientBase<IMyContract>
{
    public MyContractClient(object callbackInstance, Binding binding, EndpointAddress remoteAddress)
        : base(callbackInstance, binding, remoteAddress) { }
}

public class MyCallbackClient : IMyContractCallback
{
    public void OnCallback()
    {
        Console.WriteLine("Hi from client!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var uri = new Uri("net.tcp://localhost");
        var binding = new NetTcpBinding();
        var host = new ServiceHost(typeof(MyService), uri);
        host.AddServiceEndpoint(typeof(IMyContract), binding, "");
        host.Open();

        var callback = new MyCallbackClient();
        var client = new MyContractClient(callback, binding, new EndpointAddress(uri));
        var proxy = client.ChannelFactory.CreateChannel();
        proxy.DoSomething();
        // Printed in console:
        //  Hi from server!
        //  Hi from client!

        client.Close();
        host.Close();
    }
}

Quelques espaces de noms devront être inclus afin d'exécuter l'exemple :

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;

3voto

Tad Donaghe Points 5331

Prenez une copie de "Programming WCF Services, 2nd Edition" par Juval Lowy. Il y a de grandes sections du livre consacrées aux opérations Callback. Dans le chapitre 5, commencez à la page 214. Dans le chapitre sur la gestion de la concurrence (ch. 8), il y a encore plus d'informations.

"Programming WCF Services" est plus ou moins la "bible" de WCF.

2voto

Michael Meadows Points 15277

Si je lis bien votre question, vous voulez avoir une conversation bidirectionnelle entre le client et le serveur (le serveur peut communiquer en retour avec le client). Le site WSDualHttpBinding vous offre cette fonctionnalité.

La malheureuse réalité avec WCF est qu'il n'existe pas d'exemple simple. Il vous faut définir des contrats, configurer les services, utiliser un hôte et créer du code client. Jetez un coup d'œil à cet article pour un exemple assez simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X