43 votes

Quelles mesures dois-je prendre pour utiliser les rappels WCF?

Je suis en train d'apprendre la WCF. J'ai un simple client et le serveur d'installation de l'application et en appuyant sur un bouton sur le client, elle obtient une valeur de mise à jour à partir du serveur.

Ma prochaine étape est que je suis en train de faire un rappel à partir du serveur vers le client pour mettre à jour sa valeur. J'ai versé à travers de nombreux exemples, et ils semblent tout simplement trop grand, et porter à confusion. Est-ce que quelqu'un peut donner à ma juste l'exemple le plus simple de sa mise en œuvre en C#?

Je continue à chercher, à travers des exemples en ligne et je ne comprends pas ce qu'il faut? Bien sûr, je pourrais copier l'exemple, ligne par ligne, mais qui ne me fait pas bon parce que je ne comprends toujours pas ce qu'il faut mettre en œuvre, si je voulais le faire dans mon propre code.

Quelqu'un pourrait-il m'aider avec un exemple très simple sur ce qui suit, je dois prendre et ce que j'aurais besoin de faire dans le code serveur et ensuite 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 proposer:

 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 pour 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 existe de grandes sections du livre consacrées aux opérations de rappel. Dans le chapitre 5, commencez à la page 214. Dans le chapitre sur la gestion des accès concurrents (ch. 8), il y a encore plus d'informations.

"Programmation des services WCF" est plus ou moins la "bible" WCF.

2voto

Michael Meadows Points 15277

Si je suis en train de lire votre question, vous voulez avoir une conversation dans les deux sens entre le client et le serveur (le serveur peut communiquer avec le client). Le WSDualHttpBinding vous offre cette fonctionnalité.

La triste réalité avec WCF est qu'il n'y a pas une telle chose comme un exemple simple. Il nécessite de définir des contrats, configurer les services, et l'utilisation d'un hôte, et de créer le code de client. Jetez un oeil à cet article pour un peu simple exemple.

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