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
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;
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.
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.