次の方法で共有


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

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

概要

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

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

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

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

アプリケーションでは、System.ServiceModel.ChannelFactory を使用するか、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) で生成された ClientBase 派生クラスのインスタンスを作成することによって、必要に応じて、このようなクライアントを作成できます。これらの作成済みのクライアント クラスは、ChannelFactory によって動的に構築されるクライアント チャネル実装にカプセル化され、処理が代行されます。したがって、クライアント チャネルと、クライアント チャネルを生成するチャネル ファクトリが、このトピックの説明の中心となります。

クライアント オブジェクトとクライアント チャネル

WCF クライアントの基本インターフェイスは、System.ServiceModel.IClientChannel インターフェイスです。これは、中核となるクライアント機能だけでなく、System.ServiceModel.ICommunicationObject の基本的な通信オブジェクト機能、System.ServiceModel.IContextChannel のコンテキスト機能、および System.ServiceModel.IExtensibleObject の拡張可能な動作を公開します。

ただし、IClientChannel インターフェイスではサービス コントラクトそのものは定義しません。サービス コントラクトは (通常、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) などのツールを使用してサービス メタデータから生成される) サービス コントラクト インターフェイスによって宣言されます。WCF クライアント型は、IClientChannel とターゲットのサービス コントラクト インターフェイスの両方を拡張したもので、アプリケーションから直接操作を呼び出したり、クライアント側のランタイム機能にアクセスしたりできるようにします。WCF クライアントを作成することにより、WCF System.ServiceModel.ChannelFactory オブジェクトには、構成済みサービス エンドポイントに接続して対話できるランタイムの作成に必要な情報が提供されます。

上述のとおり、この 2 つの WCF クライアント型は、使用する前に構成する必要があります。最も単純な WCF クライアント型は、ClientBase (または、サービス コントラクトが双方向コントラクトである場合は、DuplexClientBase) から派生するオブジェクトです。これらのクライアント型はコンストラクターを使用して作成し、プログラムで構成するか、または構成ファイルを使用して構成します。また、サービス操作を呼び出すために直接呼び出されます。ClientBase オブジェクトの概要については、「WCF クライアントの概要」を参照してください。

2 番目のクライアント型は、実行時に CreateChannel メソッドへの呼び出しから生成されます。通常、通信の詳細を厳密に制御する必要があるアプリケーションでは、クライアント チャネル オブジェクトと呼ばれる、このクライアント型を使用します。このクライアント型を使用することにより、基になるクライアント ランタイムやチャネル システムに比べ、より直接的な対話が可能になるためです。

チャネル ファクトリ

クライアント呼び出しをサポートする、基になるランタイムを作成するクラスは、System.ServiceModel.ChannelFactory クラスです。WCF クライアント オブジェクトも WCF クライアント チャネル オブジェクトも、ChannelFactory オブジェクトを使用してインスタンスを作成します。ClientBase 派生クライアント オブジェクトはチャネル ファクトリの処理をカプセル化しますが、さまざまなシナリオを想定した場合、チャネル ファクトリを直接使用することをお勧めします。よくあるシナリオとしては、既存のファクトリから新しいクライアント チャネルを繰り返し作成する必要がある場合です。クライアント オブジェクトを使用している場合は、System.ServiceModel.ClientBase.ChannelFactory プロパティを呼び出して、WCF クライアント オブジェクトから、基になるチャネル ファクトリを取得できます。

チャネル ファクトリに関して覚えておく必要のある重要なことは、これらのファクトリが、System.ServiceModel.ChannelFactory.CreateChannel を呼び出す前に、指定されている構成のクライアント チャネルの新しいインスタンスを作成するという点です。いったん CreateChannel (または System.ServiceModel.ClientBase.OpenSystem.ServiceModel.ClientBase.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) を直接使用して生成したコントラクト インターフェイスを使用します。特定のコントラクトのチャネル ファクトリを作成して構成した後は、CreateChannel メソッドを呼び出して、ISampleService サービスとの通信に使用できるクライアント チャネル オブジェクトを返すことができます。

サービス コントラクト インターフェイスで ChannelFactory クラスを使用する場合は、IClientChannel インターフェイスにキャストして、明示的にチャネルを開いたり、閉じたり、中止したりする必要があります。処理を容易にするために、Svcutil.exe ツールでは、サービス コントラクト インターフェイスと IClientChannel の両方を実装するヘルパー インターフェイスも生成されます。これにより、キャストを行わずにクライアント チャネル インフラストラクチャとのやりとりを実現できます。上記のサービス コントラクトを実装するヘルパー クライアント チャネルの定義を、次のコード例に示します。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

新しい WCF クライアント チャネル オブジェクトの作成

クライアント チャネルを使用して ISampleService サービスに接続するには、チャネル ファクトリを直接使用して生成したコントラクト インターフェイス (またはヘルパー バージョン) を使用して、コントラクト インターフェイスの型を型パラメーターとして渡します。特定のコントラクトのチャネル ファクトリを作成して構成したら、System.ServiceModel.ChannelFactory.CreateChannel メソッドを呼び出して、ISampleService サービスとの通信に使用できるクライアント チャネル オブジェクトを返すことができます。

作成したクライアント チャネル オブジェクトで IClientChannel とコントラクト インターフェイスを実装します。その結果、これらを使用して、このコントラクトをサポートするサービスと対話する操作を直接呼び出すことができます。

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

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