アプリケーションは、Windows Communication Foundation (WCF) クライアント オブジェクトを使用してサービス操作を呼び出します。 このトピックでは、WCF クライアント オブジェクト、WCF クライアント チャネル、および基になるチャネル アーキテクチャとの関係について説明します。 WCF クライアント オブジェクトの基本的な概要については、「 WCF クライアントの概要」を参照してください。 チャネル レイヤーの詳細については、「チャネル レイヤー の拡張」を参照してください。
概要
サービス モデルのランタイムは、次の要素で構成される WCF クライアントを作成します。
サービス コントラクトの自動的に生成されたクライアント実装。アプリケーション コードからの呼び出しを送信メッセージに変換し、応答メッセージを出力パラメーターに変換し、アプリケーションが取得できる値を返します。
さまざまなインターフェイスをグループ化し、制御機能へのアクセスを提供するコントロール インターフェイス (System.ServiceModel.IClientChannel) の実装。特に、クライアント セッションを閉じてチャネルを破棄する機能です。
使用されるバインディングで指定された構成設定に基づいて構築されるクライアント チャネル。
アプリケーションは、System.ServiceModel.ChannelFactoryを介して、または ClientBase<TChannel> によって生成される派生クラスのインスタンスを作成することによって、必要に応じてこのようなクライアントを作成できます。 これらの既製のクライアント クラスは、 ChannelFactoryによって動的に構築されるクライアント チャネル実装をカプセル化して委任します。 そのため、クライアント チャネルと、それらを生成するチャネル ファクトリが、このディスカッションの焦点となります。
クライアント オブジェクトとクライアント チャネル
WCF クライアントの基本インターフェイスは、 System.ServiceModel.IClientChannel インターフェイスであり、コア クライアント機能と、 System.ServiceModel.ICommunicationObjectの基本的な通信オブジェクト機能、 System.ServiceModel.IContextChannelのコンテキスト機能、および System.ServiceModel.IExtensibleObject<T>の拡張可能な動作を公開します。
ただし、 IClientChannel インターフェイスでは、サービス コントラクト自体は定義されません。 これらはサービス コントラクト インターフェイスによって宣言されます (通常、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) などのツールを使用してサービス メタデータから生成されます)。 WCF クライアントの種類は、 IClientChannel とターゲット サービス コントラクト インターフェイスの両方を拡張して、アプリケーションが操作を直接呼び出せるようにし、クライアント側のランタイム機能にもアクセスできるようにします。 WCF クライアントを作成すると、WCFSystem.ServiceModel.ChannelFactory オブジェクトに、構成されたサービス エンドポイントに接続して対話できるランタイムを作成するために必要な情報が提供されます。
前述のように、2 つの WCF クライアントの種類は、使用する前に構成する必要があります。 最も単純な WCF クライアントの種類は、 ClientBase<TChannel> から派生するオブジェクトです (サービス コントラクトが双方向コントラクトの場合は DuplexClientBase<TChannel> )。 これらの型は、コンストラクターを使用するか、プログラムで構成するか、構成ファイルを使用して作成し、サービス操作を呼び出すために直接呼び出すことができます。 ClientBase<TChannel> オブジェクトの基本的な概要については、「WCF クライアントの概要」を参照してください。
2 番目の型は、 CreateChannel メソッドの呼び出しから実行時に生成されます。 通信固有の厳密な制御に関係するアプリケーションでは、通常、クライアント チャネル オブジェクトと呼ばれるこのクライアントの種類を使用します。これは、基になるクライアントランタイムとチャネル システムよりも直接的な対話が可能になるためです。
チャネル ファクトリ
クライアント呼び出しをサポートする基になるランタイムの作成を担当するクラスは、 System.ServiceModel.ChannelFactory<TChannel> クラスです。 WCF クライアント オブジェクトと WCF クライアント チャネル オブジェクトはどちらも、 ChannelFactory<TChannel> オブジェクトを使用してインスタンスを作成します。 ClientBase<TChannel> 派生クライアント オブジェクトはチャネル ファクトリの処理をカプセル化しますが、多くのシナリオではチャネル ファクトリを直接使用することは完全に妥当です。 この一般的なシナリオは、既存のファクトリから新しいクライアント チャネルを繰り返し作成する場合です。 クライアント オブジェクトを使用している場合は、 ClientBase<TChannel>.ChannelFactory プロパティを呼び出すことによって、WCF クライアント オブジェクトから基になるチャネル ファクトリを取得できます。
チャネル ファクトリについて覚えておくべき重要な点は、 ChannelFactory<TChannel>.CreateChannelを呼び出す前に、提供された構成用にクライアント チャネルの新しいインスタンスを作成することです。 CreateChannel (または WCF クライアント オブジェクトに対するClientBase<TChannel>.Open、ClientBase<TChannel>.CreateChannel、または任意の操作) を呼び出すと、チャネル ファクトリを変更することはできず、単にターゲット エンドポイント アドレスを変更している場合でも、異なるサービス インスタンスにチャネルを取得することが想定されます。 別の構成でクライアント オブジェクトまたはクライアント チャネルを作成する場合は、まず新しいチャネル ファクトリを作成する必要があります。
WCF クライアント オブジェクトと WCF クライアント チャネルの使用に関するさまざまな問題の詳細については、「WCF クライアント を使用したサービスへのアクセス」を参照してください。
次の 2 つのセクションでは、WCF クライアント チャネル オブジェクトの作成と使用について説明します。
新しい WCF クライアント チャネル オブジェクトの作成
クライアント チャネルの使用を説明するために、次のサービス コントラクトが生成されていると仮定します。
[System.ServiceModel.ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[System.ServiceModel.OperationContractAttribute(
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
typeof(microsoft.wcf.documentation.SampleFault),
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);
}
ISampleService
サービスに接続するには、生成されたコントラクト インターフェイスをチャネル ファクトリ (ChannelFactory<TChannel>) と直接使用します。 特定のコントラクトのチャネル ファクトリを作成して構成したら、 CreateChannel メソッドを呼び出して、 ISampleService
サービスとの通信に使用できるクライアント チャネル オブジェクトを返すことができます。
サービス コントラクト インターフェイスで ChannelFactory<TChannel> クラスを使用する場合、チャネルを明示的に開く、閉じる、または中止するには、 IClientChannel インターフェイスにキャストする必要があります。 Svcutil.exe ツールでは、操作を容易にするために、サービス コントラクト インターフェイスと IClientChannel の両方を実装するヘルパー インターフェイスも生成され、キャストしなくてもクライアント チャネル インフラストラクチャと対話できます。 次のコードは、前のサービス コントラクトを実装するヘルパー クライアント チャネルの定義を示しています。
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}
新しい WCF クライアント チャネル オブジェクトの作成
クライアント チャネルを使用して ISampleService
サービスに接続するには、生成されたコントラクト インターフェイス (またはヘルパー バージョン) をチャネル ファクトリと直接使用し、コントラクト インターフェイスの型を型パラメーターとして渡します。 特定のコントラクトのチャネル ファクトリが作成および構成されたら、 ChannelFactory<TChannel>.CreateChannel メソッドを呼び出して、 ISampleService
サービスとの通信に使用できるクライアント チャネル オブジェクトを返すことができます。
クライアント チャネル オブジェクトを作成すると、 IClientChannel とコントラクト インターフェイスが実装されます。 そのため、それらを直接使用して、そのコントラクトをサポートするサービスと対話する操作を呼び出すことができます。
クライアント オブジェクトとクライアント チャネル オブジェクトの使用の違いは、開発者にとって制御と使いやすさの 1 つに過ぎません。 クラスとオブジェクトの操作に慣れている多くの開発者は、WCF クライアント チャネルではなく WCF クライアント オブジェクトを使用することを好みます。
例については、「 方法: ChannelFactory を使用する」を参照してください。