双方向サービス
双方向サービス コントラクトは、両方のエンドポイントが互いに独立してメッセージを送信できるメッセージ交換パターンです。双方向サービスでは、クライアントのエンドポイントにメッセージを返信できるため、イベントのような動作を実現できます。双方向通信は、クライアントがサービスに接続し、サービスからクライアントにメッセージを返信できるチャネルがサービスに提供されると発生します。双方向サービスにおけるイベントのような動作は、セッション内でのみ機能することに注意してください。
双方向コントラクトを作成するには、インターフェイスのペアを作成します。最初のインターフェイスは、クライアントから呼び出すことのできる操作を記述したサービス コントラクト インターフェイスです。サービス コントラクトでは、System.ServiceModel.ServiceContractAttribute.CallbackContract プロパティにコールバック コントラクトを指定する必要があります。このコールバック コントラクトが、サービスがクライアント エンドポイントで呼び出すことのできる操作を定義するインターフェイスになります。双方向コントラクトではセッションは必要ありませんが、システム指定の二重バインディングではセッションを利用します。
双方向コントラクトの例を次に示します。
CalculatorService
クラスは、プライマリ ICalculatorDuplex
インターフェイスを実装します。このサービスは PerSession インスタンス モードを使用して、各セッションの結果を保持します。Callback
というプライベート プロパティを使用して、クライアントへのコールバック チャネルにアクセスします。次のサンプル コードに示すように、サービスはこのコールバックを使用し、コールバック インターフェイスを介してメッセージをクライアントに返信します。
クライアントは、サービスからのメッセージを受信するために、双方向コントラクトのコールバック インターフェイスを実装するクラスを提供する必要があります。次のサンプル コードに、ICalculatorDuplexCallback
インターフェイスを実装する CallbackHandler
クラスを示します。
双方向コントラクト用に生成された WCF クライアントには、構築時に InstanceContext クラスを提供する必要があります。この InstanceContext クラスが、コールバック インターフェイスを実装するオブジェクトのサイトとして使用され、サービスから返信されるメッセージを処理します。InstanceContext クラスは、CallbackHandler
クラスのインスタンスを使用して構築されます。このオブジェクトは、コールバック インターフェイスでサービスからクライアントに送信されるメッセージを処理します。
サービスの構成は、セッション通信と双方向通信の両方をサポートするバインディングを提供するように設定する必要があります。wsDualHttpBinding 要素はセッション通信をサポートし、どちらの方向にも HTTP 接続が 1 つ用意される双方向 HTTP 接続を提供して双方向通信を実現します。
クライアントで、サーバーがクライアントへの接続に使用するアドレスを構成する必要があります。次のサンプル構成を参照してください。
メモ : |
---|
非双方向クライアントがセキュリティで保護されたメッセージ交換を使用して認証に失敗した場合、通常、MessageSecurityException がスローされます。ただし、セキュリティで保護されたメッセージ交換を使用する双方向クライアントが認証に失敗した場合、クライアントは代わりに TimeoutException を受信します。 |
WSHttpBinding 要素を使用するクライアントとサービスを作成しても、クライアントのコールバック エンドポイントが含まれていない場合は、次のエラーが発生します。
HTTP could not register URL
htp://+:80/Temporary_Listen_Addresses/<guid> because TCP port 80 is being used by another application.
次のサンプル コードは、コードでクライアントのエンドポイント アドレスを指定する方法を示しています。
WSDualHttpBinding binding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("https://localhost:12000/DuplexTestUsingCode/Server");
binding.ClientBaseAddress = new Uri("https://localhost:8000/DuplexTestUsingCode/Client/");
次のサンプル コードは、構成でクライアントのエンドポイント アドレスを指定する方法を示しています。
<client>
<endpoint name ="ServerEndpoint"
address="https://localhost:12000/DuplexTestUsingConfig/Server"
bindingConfiguration="WSDualHttpBinding_IDuplexTest"
binding="wsDualHttpBinding"
contract="IDuplexTest" />
</client>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IDuplexTest"
clientBaseAddress="https://localhost:8000/myClient/" >
<security mode="None"/>
</binding>
</wsDualHttpBinding>
</bindings>
関連項目
タスク
方法 : チャネル ファクトリを作成および使用して、チャネルを作成および管理する