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

アプリケーションでは、Windows Communication Foundation (WCF) クライアント オブジェクトを使用して、サービス操作を呼び出します。Applications use Windows Communication Foundation (WCF) client objects to invoke service operations. このトピックでは、WCF クライアント オブジェクト、WCF クライアント チャネル、およびそれらの関係を基になるチャネル アーキテクチャについて説明します。This topic discusses WCF client objects, WCF client channels, and their relationships to the underlying channel architecture. WCF クライアント オブジェクトの基本的な概要については、次を参照してください。 WCF Client Overviewします。For a basic overview of WCF client objects, see WCF Client Overview. チャネル レイヤーの詳細については、次を参照してください。チャネル レイヤーの拡張します。For more information about the channel layer, see Extending the Channel Layer.

概要Overview

サービス モデル ランタイムは、次の構成される WCF クライアントを作成します。The service model run time creates WCF clients, which are composed of the following:

  • 自動的に生成される、サービス コントラクトのクライアント実装。これは、アプリケーション コードからの呼び出しを送信メッセージに変換すると共に、応答メッセージを出力パラメーターに変換して、アプリケーションが取得できる値を返します。An automatically generated client implementation of a service contract, which turns calls from your application code into outgoing messages, and turns response messages into output parameters and return values that your application can retrieve.

  • コントロール インターフェイス (System.ServiceModel.IClientChannel) の実装。これは、さまざまなインターフェイスをグループ化し、コントロールの機能 (特に、クライアント セッションの終了機能とチャネルの破棄機能) へのアクセスを提供します。An implementation of a control interface (System.ServiceModel.IClientChannel) that groups together various interfaces and provides access to control functionality, most notably the ability to close the client session and dispose the channel.

  • クライアント チャネル。これは、使用するバインディングによって指定される構成設定に基づいて構築されます。A client channel that is built based on the configuration settings specified by the used binding.

アプリケーションはオンデマンドで使用するかこのようなクライアントを作成することができます、System.ServiceModel.ChannelFactoryまたはのインスタンスを作成して、ClientBase<TChannel>によって生成されるクラスを派生、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)します。Applications can create such clients on demand, either through a System.ServiceModel.ChannelFactory or by creating an instance of a ClientBase<TChannel> derived class as it is generated by the ServiceModel Metadata Utility Tool (Svcutil.exe). これらの作成済みのクライアント クラスは、ChannelFactory によって動的に構築されるクライアント チャネル実装にカプセル化され、処理が代行されます。These ready-built client classes encapsulate and delegate to a client channel implementation that is dynamically constructed by a ChannelFactory. したがって、クライアント チャネルと、クライアント チャネルを生成するチャネル ファクトリが、このトピックの説明の中心となります。Therefore, the client channel and the channel factory that produces them are the focal point of interest for this discussion.

クライアント オブジェクトとクライアント チャネルClient Objects and Client Channels

WCF クライアントの基本インターフェイスは、System.ServiceModel.IClientChannelインターフェイス、クライアントのコア機能と同様の基本的な通信オブジェクト機能を公開するSystem.ServiceModel.ICommunicationObjectのコンテキスト機能System.ServiceModel.IContextChannelとの拡張可能な動作System.ServiceModel.IExtensibleObject<T>.The base interface of WCF clients is the System.ServiceModel.IClientChannel interface, which exposes core client functionality as well as the basic communication object functionality of System.ServiceModel.ICommunicationObject, the context functionality of System.ServiceModel.IContextChannel, and the extensible behavior of System.ServiceModel.IExtensibleObject<T>.

ただし、IClientChannel インターフェイスではサービス コントラクトそのものは定義しません。The IClientChannel interface, however, does not define a service contract itself. サービス コントラクト インターフェイスによって宣言されます (通常のようなツールを使用してサービス メタデータから生成、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe))。Those are declared by the service contract interface (typically generated from service metadata using a tool like the ServiceModel Metadata Utility Tool (Svcutil.exe)). WCF クライアントの種類は、両方を拡張IClientChannelとクライアント側のランタイム機能にも、直接操作を呼び出すアプリケーションを有効にするには、ターゲット サービス コントラクト インターフェイスにアクセスします。WCF client types extend both IClientChannel and the target service contract interface to enable applications to call operations directly and also have access to client-side run-time functionality. WCF は、WCF クライアントの作成System.ServiceModel.ChannelFactory接続を構成済みのサービス エンドポイントと対話できる実行時に作成するために必要な情報を持つオブジェクト。Creating an WCF client provides WCFSystem.ServiceModel.ChannelFactory objects with the information necessary to create a run time that can connect and interact with the configured service endpoint.

前述のように、使用する前に、2 つの WCF クライアントの種類を構成する必要があります。As mentioned earlier, the two WCF client types must be configured before you can use them. 最も簡単な WCF クライアントの種類はから派生したオブジェクトClientBase<TChannel>(またはDuplexClientBase<TChannel>サービス コントラクトが双方向コントラクトの場合)。The simplest WCF client types are objects that derive from ClientBase<TChannel> (or DuplexClientBase<TChannel> if the service contract is a duplex contract). これらのクライアント型はコンストラクターを使用して作成し、プログラムで構成するか、または構成ファイルを使用して構成します。また、サービス操作を呼び出すために直接呼び出されます。You can create these types by using a constructor, configured programmatically, or by using a configuration file, and then called directly to invoke service operations. 基本的な概要のClientBase<TChannel>、オブジェクトを参照してくださいWCF Client Overviewします。For a basic overview of ClientBase<TChannel> objects, see WCF Client Overview.

2 番目のクライアント型は、実行時に CreateChannel メソッドへの呼び出しから生成されます。The second type is generated at run time from a call to the CreateChannel method. 通常、通信の詳細厳格に制御を必要があるアプリケーションと呼ばれるこのクライアントの種類を使用して、クライアント チャネル オブジェクト基になるクライアント ランタイムとチャネルより直接的な対話を有効になるので、システム。Applications concerned with tight control of the communication specifics typically use this client type, called a client channel object, because it enables more direct interaction than the underlying client run-time and channel system.

チャネル ファクトリChannel Factories

クライアント呼び出しをサポートする、基になるランタイムを作成するクラスは、System.ServiceModel.ChannelFactory<TChannel> クラスです。The class that is responsible for creating the underlying run time that supports client invocations is the System.ServiceModel.ChannelFactory<TChannel> class. WCF クライアント オブジェクトと WCF クライアント チャネル オブジェクトの使用、 ChannelFactory<TChannel> ; のインスタンスを作成するオブジェクト、ClientBase<TChannel>派生クライアント オブジェクトには、チャネル ファクトリの処理がカプセル化しますが、多くのシナリオは、使用することをお勧めしますチャネル ファクトリで直接使用します。Both WCF client objects and WCF client channel objects use a ChannelFactory<TChannel> object to create instances; the ClientBase<TChannel> derived client object encapsulates the handling of the channel factory, but for a number of scenarios it is perfectly reasonable to use the channel factory directly. よくあるシナリオとしては、既存のファクトリから新しいクライアント チャネルを繰り返し作成する必要がある場合です。The common scenario for this is if you want to repeatedly create new client channels from an existing factory. クライアント オブジェクトを使用している場合、WCF クライアント オブジェクトからの基になるチャネル ファクトリする取得呼び出すことによって、ClientBase<TChannel>.ChannelFactoryプロパティ。If you are using a client object, you can obtain the underlying channel factory from a WCF client object by calling the ClientBase<TChannel>.ChannelFactory property.

チャネル ファクトリに関して覚えておく必要のある重要なことは、これらのファクトリが、ChannelFactory<TChannel>.CreateChannel を呼び出す前に、指定されている構成のクライアント チャネルの新しいインスタンスを作成するという点です。The important thing to remember about channel factories is that they create new instances of client channels for the configuration provided to them prior to calling ChannelFactory<TChannel>.CreateChannel. 呼び出すCreateChannel(またはClientBase<TChannel>.OpenClientBase<TChannel>.CreateChannel、または WCF クライアント オブジェクトのすべての操作)、チャネル ファクトリを変更し、さまざまなサービスのインスタンスへのチャネルを取得する場合でも、ターゲットのエンドポイント アドレスを変更するだけでに予想されることはできません。Once you call CreateChannel (or ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel, or any operation on a WCF client object), you cannot modify the channel factory and expect to get channels to different service instances, even if you are merely changing the target endpoint address. 異なる構成でクライアント オブジェクトやクライアント チャネルを作成するには、まず新しいチャネル ファクトリを作成する必要があります。If you want to create a client object or client channel with a different configuration, you must create a new channel factory first.

WCF クライアント オブジェクトと WCF クライアント チャネルを使用してさまざまな問題の詳細については、次を参照してください。にアクセスするサービスの WCF クライアントを使用してします。For more information about various issues using WCF client objects and WCF client channels, see Accessing Services Using a WCF Client.

次の 2 つのセクションでは、作成と WCF クライアント チャネル オブジェクトの使用について説明します。The following two sections describe the creation and use of WCF client channel objects.

新しい WCF クライアント チャネル オブジェクトの作成Creating a New WCF Client Channel Object

次のサービス コントラクトが生成されていることを前提に、クライアント チャネルの使用方法を説明します。To illustrate the use of a client channel, assume the following service contract has been generated.

[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>) を直接使用して生成したコントラクト インターフェイスを使用します。To connect to an ISampleService service, use the generated contract interface directly with a channel factory (ChannelFactory<TChannel>). 特定のコントラクトのチャネル ファクトリを作成して構成した後は、CreateChannel メソッドを呼び出して、ISampleService サービスとの通信に使用できるクライアント チャネル オブジェクトを返すことができます。Once you create and configure a channel factory for a particular contract, you can call the CreateChannel method to return client channel objects that you can use to communicate with an ISampleService service.

サービス コントラクト インターフェイスで ChannelFactory<TChannel> クラスを使用する場合、明示的にチャネルを開いたり、閉じたり、中止したりするには、IClientChannel インターフェイスにキャストする必要があります。When using the ChannelFactory<TChannel> class with a service contract interface, you must cast to the IClientChannel interface to explicitly open, close, or abort the channel. 処理を容易にするために、Svcutil.exe ツールでは、サービス コントラクト インターフェイスと IClientChannel の両方を実装するヘルパー インターフェイスも生成されます。これにより、キャストを行わずにクライアント チャネル インフラストラクチャとのやりとりを実現できます。To make it easier to work with, the Svcutil.exe tool also generates a helper interface that implements both the service contract interface and IClientChannel to enable you to interact with the client channel infrastructure without having to cast. 上記のサービス コントラクトを実装するヘルパー クライアント チャネルの定義を、次のコード例に示します。The following code shows the definition of a helper client channel that implements the preceding service contract.

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

新しい WCF クライアント チャネル オブジェクトの作成Creating a New WCF Client Channel Object

クライアント チャネルを使用して ISampleService サービスに接続するには、チャネル ファクトリを直接使用して生成したコントラクト インターフェイス (またはヘルパー バージョン) を使用して、コントラクト インターフェイスの型を型パラメーターとして渡します。To use a client channel to connect to an ISampleService service, use the generated contract interface (or the helper version) directly with a channel factory, passing the type of the contract interface as the type parameter. 特定のコントラクトのチャネル ファクトリを作成して構成したら、ChannelFactory<TChannel>.CreateChannel メソッドを呼び出して、ISampleService サービスとの通信に使用できるクライアント チャネル オブジェクトを返すことができます。Once a channel factory for a particular contract has been created and configured, you can call the ChannelFactory<TChannel>.CreateChannel method to return client channel objects that you can use to communicate with an ISampleService service.

作成したクライアント チャネル オブジェクトで IClientChannel とコントラクト インターフェイスを実装します。When created, the client channel objects implement IClientChannel and the contract interface. その結果、これらを使用して、このコントラクトをサポートするサービスと対話する操作を直接呼び出すことができます。Therefore, you can use them directly to call operations that interact with a service that supports that contract.

クライアント オブジェクトを使用するかクライアント チャネル オブジェクトを使用するかは、開発者がきめ細かな制御を優先するか容易さを優先するかの違いだけです。The difference between using client objects and client channel objects is merely one of control and ease of use for developers. WCF クライアント チャネルではなく、WCF クライアント オブジェクトを使用するクラスとオブジェクトの使用を使い慣れている多くの開発者が優先されます。Many developers who are comfortable working with classes and objects will prefer to use the WCF client object instead of the WCF client channel.

例については、「方法: ChannelFactory を使用して、します。For an example, see How to: Use the ChannelFactory.