web-dev-qa-db-fra.com

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

J'essaie d'apprendre WCF. J'ai une configuration d'application client et serveur simple et en appuyant sur un bouton sur le client, il obtient une valeur mise à jour du serveur.

Ma prochaine étape est que j'essaie de faire un rappel du serveur vers le client pour mettre à jour sa valeur. J'ai parcouru de nombreux exemples, et ils semblent juste trop gros et déroutants. Y a-t-il quelqu'un qui peut donner mon exemple le plus simple de sa mise en œuvre en C #?

Je continue de chercher des exemples en ligne et je ne comprends tout simplement pas ce qu'il faut? Bien sûr, je pourrais copier l'exemple ligne par ligne, mais cela ne me sert à rien car je ne sais toujours pas quoi implémenter si je voulais le faire dans mon propre code.

Quelqu'un pourrait-il m'aider s'il vous plaît avec un exemple très simple sur les étapes que je devrais prendre et ce que je devrais faire dans le code serveur puis dans le code client pour que cela se produise?

Je vous remercie

43
kevin bailey

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;
85
Ray Vernagus

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.

3
Tad Donaghe

Je sais, vieille question ... Je suis tombé sur cette question lors d'une recherche sur Google plus tôt dans la journée et la réponse fournie par Ray Vernagus est l'exemple le plus facile à comprendre de WCF que j'ai lu à ce jour. À tel point que j'ai pu le réécrire dans VB.NET sans utiliser de convertisseurs en ligne. J'ai pensé ajouter la variante VB.NET de l'exemple fourni par Ray Vernagus. Créez simplement une nouvelle application de console Windows VB.NET, ajoutez une référence à System.ServiceModel, et copiez/collez l'intégralité du code ci-dessous dans la valeur par défaut Module1 fichier de classe.

Imports System.ServiceModel
Imports System.ServiceModel.Channels



Public Interface IMyContractCallback
    <OperationContract()> _
    Sub OnCallBack()
End Interface

<ServiceContract(CallBackContract:=GetType(IMyContractCallback))> _
Public Interface IMyContract
    <OperationContract()> _
    Sub DoSomething()
End Interface

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Reentrant)> _
Public Class Myservice
    Implements IMyContract

    Public Sub DoSomething() Implements IMyContract.DoSomething
        Console.WriteLine("Hi from server!")
        Dim callback As IMyContractCallback = OperationContext.Current.GetCallbackChannel(Of IMyContractCallback)()
        callback.OnCallBack()
    End Sub
End Class

Public Class MyContractClient
    Inherits DuplexClientBase(Of IMyContract)

    Public Sub New(ByVal callbackinstance As Object, ByVal binding As Binding, ByVal remoteAddress As EndpointAddress)
        MyBase.New(callbackinstance, binding, remoteAddress)
    End Sub
End Class

Public Class MyCallbackClient
    Implements IMyContractCallback

    Public Sub OnCallBack() Implements IMyContractCallback.OnCallBack
        Console.WriteLine("Hi from client!")
    End Sub
End Class


Module Module1

    Sub Main()
        Dim uri As New Uri("net.tcp://localhost")
        Dim binding As New NetTcpBinding()
        Dim Host As New ServiceHost(GetType(Myservice), uri)
        Host.AddServiceEndpoint(GetType(IMyContract), binding, "")
        Host.Open()

        Dim callback As New MyCallbackClient()
        Dim client As New MyContractClient(callback, binding, New EndpointAddress(uri))
        Dim proxy As IMyContract = client.ChannelFactory.CreateChannel()

        proxy.DoSomething()
        ' Printed in console:
        '  Hi from server!
        '  Hi from client!

        Console.ReadLine()

        client.Close()
        Host.Close()
    End Sub

End Module

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

La triste réalité avec WCF est qu'il n'existe pas de simple exemple. Il vous oblige à définir des contrats, à configurer les services, à utiliser un hôte et à créer du code client. Jetez un oeil à cet article pour un exemple quelque peu simple.

2
Michael Meadows