クライアント アーキテクチャ

アプリケーションでは、Windows Communication Foundation (WCF) クライアント オブジェクトを使用してサービス操作を呼び出します。 このトピックでは、WCF クライアント オブジェクト、WCF クライアント チャネル、およびこれらとその基になるチャネル アーキテクチャとのリレーションシップについて説明します。 WCF クライアント オブジェクトの概要については、「WCF クライアントの概要」を参照してください。 チャネル レイヤーの詳細については、「チャネル レイヤーの拡張」を参照してください。

概要

WCF クライアントはサービス モデル ランタイムによって作成され、次の要素で構成されます。

  • 自動的に生成される、サービス コントラクトのクライアント実装。これは、アプリケーション コードからの呼び出しを送信メッセージに変換すると共に、応答メッセージを出力パラメーターに変換して、アプリケーションが取得できる値を返します。

  • コントロール インターフェイス (System.ServiceModel.IClientChannel) の実装。これは、さまざまなインターフェイスをグループ化し、コントロールの機能 (特に、クライアント セッションの終了機能とチャネルの破棄機能) へのアクセスを提供します。

  • クライアント チャネル。これは、使用するバインディングによって指定される構成設定に基づいて構築されます。

アプリケーションでは、System.ServiceModel.ChannelFactory を使用するか、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) で生成された 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 (または ClientBase<TChannel>.OpenClientBase<TChannel>.CreateChannel、あるいは WCF クライアント オブジェクトに対する任意の操作) を呼び出した場合、ターゲットのエンドポイント アドレスを変更するだけでは、チャネル ファクトリを変更したり、別のサービス インスタンスへのチャネルを取得したりすることはできません。 異なる構成でクライアント オブジェクトやクライアント チャネルを作成するには、まず新しいチャネル ファクトリを作成する必要があります。

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 とコントラクト インターフェイスを実装します。 その結果、これらを使用して、このコントラクトをサポートするサービスと対話する操作を直接呼び出すことができます。

クライアント オブジェクトを使用するかクライアント チャネル オブジェクトを使用するかは、開発者がきめ細かな制御を優先するか容易さを優先するかの違いだけです。 クラスやオブジェクトの処理に慣れている開発者の多くが、WCF クライアント チャネルではなく WCF クライアント オブジェクトを選択することも考えられます。

例については、「方法: ChannelFactory を使用する」を参照してください。