方法: 二重コントラクトを使用してサービスにアクセスする
Windows Communication Foundation (WCF) の機能の 1 つに、双方向のメッセージング パターンを使用するサービスを作成する機能があります。 双方向のメッセージング パターンを使用するサービスは、コールバックを通じてクライアントと通信できます。 このトピックでは、コールバック インターフェイスを実装するクライアント クラス内に WCF クライアントを作成する手順を示します。
二重バインディングでは、クライアントの IP アドレスをサービスに公開します。 クライアントは、セキュリティを使用して信頼するサービスだけに接続できるようにする必要があります。
WCF の基本的なサービスとクライアントの作成方法に関するチュートリアルについては、入門チュートリアルのページを参照してください。
双方向サービスにアクセスするには
2 つのインターフェイスを含むサービスを作成します。 1 つ目のインターフェイスはサービスに使用し、2 つ目のインターフェイスはコールバックに使用します。 双方向サービスの作成の詳細については、「方法: 双方向コントラクトを作成する」を参照してください。
サービスを実行します。
ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用して、クライアントのコントラクト (インターフェイス) を生成します。 この方法の詳細については、クライアントの作成方法に関するページを参照してください。
次の例に示すように、クライアント クラスにコールバック インターフェイスを実装します。
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
InstanceContext クラスのインスタンスを作成します。 コンストラクターには、クライアント クラスのインスタンスが必要です。
InstanceContext site = new InstanceContext(new CallbackHandler());
Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
InstanceContext オブジェクトを必要とするコンストラクターを使用して、WCF クライアントのインスタンスを作成します。 コンストラクターの 2 番目のパラメーターは、構成ファイルに含まれるエンドポイントの名前です。
CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default");
Dim wcfClient As New CalculatorDuplexClient(site, "default")
必要に応じて、WCF クライアントのメソッドを呼び出します。
例
双方向コントラクトにアクセスするクライアント クラスを作成する方法を次のコード例に示します。
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