Procédure : Accéder aux services avec un contrat duplex
WCF (Windows Communication Foundation) dispose d’une fonctionnalité qui permet de créer un service utilisant un modèle de messagerie duplex. Ce modèle permet à un service de communiquer avec un client via un rappel. Cette rubrique contient la procédure permettant de créer un client WCF dans une classe client qui implémente une interface de rappel.
Une liaison double expose l'adresse IP du client au service. Ce client doit utiliser un mode de sécurité afin de garantir sa connexion à un service fiable.
Pour un tutoriel sur la création d’un service WCF et d’un client de base, consultez Tutoriel pour bien démarrer.
Pour accéder à un service duplex
Créez un service qui contient deux interfaces. La première interface est pour le service, la deuxième est pour le rappel. Pour plus d’informations sur la création d’un service duplex, consultez Procédure : Créer un contrat duplex.
Exécutez le service.
Utilisez l’Outil Service Model Metadata Utility (Svcutil.exe) pour générer les contrats (interfaces) pour le client. Pour des informations sur la manière de procéder, consultez Guide pratique : Créer un client.
Implémentez l'interface de rappel dans la classe client, comme illustré dans l'exemple suivant.
public class CallbackHandler : ICalculatorDuplexCallback { public void Result(double result) { Console.WriteLine("Result ({0})", result); } public void Equation(string equation) { Console.WriteLine("Equation({0})", equation); } }
Public Class CallbackHandler Implements ICalculatorDuplexCallback Public Sub Result (ByVal result As Double) Console.WriteLine("Result ({0})", result) End Sub Public Sub Equation(ByVal equation As String) Console.WriteLine("Equation({0})", equation) End Sub End Class
Créez une instance de la classe InstanceContext. Le constructeur a besoin d'une instance de la classe client.
InstanceContext site = new InstanceContext(new CallbackHandler());
Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
Créez une instance de client WCF à l’aide du constructeur qui nécessite un objet InstanceContext. Le second paramètre du constructeur correspond au nom du point de terminaison trouvé dans le fichier de configuration.
CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default");
Dim wcfClient As New CalculatorDuplexClient(site, "default")
Appelez les méthodes du client WCF comme requis.
Exemple
L'exemple de code suivant illustre comment créer une classe client qui accède à un contrat duplex.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
// Define class that implements the callback interface of duplex
// contract.
public class CallbackHandler : ICalculatorDuplexCallback
{
public void Result(double result)
{
Console.WriteLine("Result({0})", result);
}
public void Equation(string equation)
{
Console.WriteLine("Equation({0})", equation);
}
}
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
CalculatorDuplexClient wcfClient
= new CalculatorDuplexClient(new InstanceContext(new CallbackHandler()));
try
{
// Call the AddTo service operation.
double value = 100.00D;
wcfClient.AddTo(value);
// Call the SubtractFrom service operation.
value = 50.00D;
wcfClient.SubtractFrom(value);
// Call the MultiplyBy service operation.
value = 17.65D;
wcfClient.MultiplyBy(value);
// Call the DivideBy service operation.
value = 2.00D;
wcfClient.DivideBy(value);
// Complete equation.
wcfClient.Clear();
// Wait for callback messages to complete before
// closing.
System.Threading.Thread.Sleep(5000);
// Close the WCF client.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
wcfClient.Abort();
Console.Read();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
wcfClient.Abort();
Console.Read();
}
}
}
Imports System.ServiceModel
Namespace Microsoft.ServiceModel.Samples
' The service contract is defined in generatedClient.vb, generated from the service by the svcutil tool.
' Define class which implements callback interface of duplex contract
Public Class CallbackHandler
Implements ICalculatorDuplexCallback
Public Sub Result(ByVal result As Double) Implements ICalculatorDuplexCallback.Result
Console.WriteLine("Result({0})", result)
End Sub
Public Sub Equation(ByVal eqn As String) Implements ICalculatorDuplexCallback.Equation
Console.WriteLine("Equation({0})", eqn)
End Sub
End Class
Class Client
Public Shared Sub Main()
' Construct InstanceContext to handle messages on callback interface
Dim instanceContext As New InstanceContext(New CallbackHandler())
' Create a client
Dim wcfClient As New CalculatorDuplexClient(instanceContext)
Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.")
Console.WriteLine()
Try
' Call the AddTo service operation.
Dim value As Double = 100
wcfClient.AddTo(value)
' Call the SubtractFrom service operation.
value = 50
wcfClient.SubtractFrom(value)
' Call the MultiplyBy service operation.
value = 17.65
wcfClient.MultiplyBy(value)
' Call the DivideBy service operation.
value = 2
wcfClient.DivideBy(value)
' Complete equation
wcfClient.Clear()
Console.ReadLine()
'Closing the client gracefully closes the connection and cleans up resources
wcfClient.Close()
Catch timeout As TimeoutException
Console.WriteLine(timeout.Message)
wcfClient.Abort()
Catch commException As CommunicationException
Console.WriteLine(commException.Message)
wcfClient.Abort()
End Try
End Sub
End Class
End Namespace