Vorgehensweise: Zugriff auf Dienste mit einem Duplexvertrag
Eine Funktion von Windows Communication Foundation (WCF) besteht in der Fähigkeit, einen Dienst zu erstellen, der ein Duplexnachrichtenmuster verwendet. Anhand dieses Musters kann ein Dienst mit dem Client über einen Rückruf kommunizieren Dieses Thema beschreibt die Schritte, mit denen Sie einen WCF-Client in einer Client-Klasse, die die Rückrufschnittstelle implementiert, erstellen können.
Eine Dualbindung macht die IP-Adresse des Clients für den Dienst verfügbar. Der Client sollte Sicherheit eingestellt haben, um sicherzustellen, dass nur Verbindungen zu vertrauensvollen Diensten hergestellt werden.
Ein Tutorial zum Erstellen eines grundlegenden WCF-Diensts und -Clients finden Sie unter Tutorial mit ersten Schritten.
So greifen Sie auf einen Duplexdienst zu
Erstellen Sie einen Dienst, der zwei Schnittstellen enthält. Die erste Schnittstelle ist dem Dienst vorbehalten, die zweite Schnittstelle wird für den Rückruf verwendet. Weitere Informationen zum Erstellen eines Duplexdiensts finden Sie unter Vorgehensweise: Erstellen eines Duplexvertrags.
Führen Sie den Dienst aus.
Verwenden Sie das ServiceModel Metadata Utility-Tool (Svcutil.exe), um Verträge (Schnittstellen) für den Client zu generieren. Informationen dazu finden Sie unter Vorgehensweise: Erstellen eines Clients.
Implementieren Sie die Rückrufschnittstelle in der Client-Klasse, wie im nachfolgenden Beispiel dargestellt.
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
Erstellen Sie eine Instanz der InstanceContext-Klasse. Der Konstruktor benötigt eine Instanz der Client-Klasse.
InstanceContext site = new InstanceContext(new CallbackHandler());
Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
Erstellen Sie eine Instanz des WCF-Clients mit dem Konstruktor, für den ein InstanceContext-Objekt erforderlich ist. Der zweite Parameter des Konstruktors ist der Name eines Endpunkts in der Konfigurationsdatei.
CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default");
Dim wcfClient As New CalculatorDuplexClient(site, "default")
Rufen Sie die Methoden des WCF-Clients nach Bedarf auf.
Beispiel
Im folgenden Codebeispiel wird das Erstellen einer Client-Klasse veranschaulicht, die auf einen Duplexvertrag zugreift.
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