このドキュメントでは、Windows Communication Foundation (WCF) アーキテクチャの概要を説明します。 これは、主要な概念とその組み合わせについて説明することを目的としています。 WCF サービスとクライアントの最も単純なバージョンの作成に関するチュートリアルについては、「 入門チュートリアル」を参照してください。 WCF プログラミングの詳細については、「 基本的な WCF プログラミング」を参照してください。
WCF の基礎
WCF は、サービスとクライアントの間でメッセージを送信するシステムを作成するためのランタイムおよび API のセットです。 同じインフラストラクチャと API を使用して、同じコンピューター システムまたは別の会社に存在し、インターネット経由でアクセスされるシステム上の他のアプリケーションと通信するアプリケーションを作成します。
メッセージングとエンドポイント
WCF はメッセージ ベースの通信の概念に基づいており、メッセージとしてモデル化できるもの (HTTP 要求やメッセージ キュー (MSMQ) メッセージなど) は、プログラミング モデルで統一された方法で表すことができます。 これにより、さまざまなトランスポート メカニズムにわたって統合 API が可能になります。
このモデルは、通信を開始するアプリケーションであるクライアントと、クライアントが通信してその通信に応答するのを待機するアプリケーションを区別します。 1 つのアプリケーションは、クライアントとサービスの両方として機能できます。 例については、「 双方向サービス 」と 「ピアツーピア ネットワーク」を参照してください。
メッセージはエンドポイント間で送信されます。 エンドポイント は、メッセージが送受信される場所 (またはその両方) であり、メッセージ交換に必要なすべての情報を定義します。 サービスは 1 つ以上のアプリケーション エンドポイント (および 0 個以上のインフラストラクチャ エンドポイント) を公開し、クライアントはサービスのエンドポイントの 1 つと互換性のあるエンドポイントを生成します。
エンドポイントは、メッセージを送信する必要がある標準ベースの方法、メッセージの送信方法、およびメッセージの外観を記述します。 サービスは、クライアントが適切な WCF クライアントと通信スタックを生成するために処理できるメタデータとしてこの情報 を公開できます。
通信プロトコル
通信スタックの必須要素の 1 つは 、トランスポート プロトコルです。 メッセージは、HTTP や TCP などの一般的なトランスポートを使用して、イントラネットとインターネット経由で送信できます。 ピア ネットワーク メッシュ上のメッセージ キュー アプリケーションおよびノードとの通信をサポートする他のトランスポートが含まれています。 WCF の組み込みの拡張ポイントを使用して、より多くのトランスポート メカニズムを追加できます。
通信スタックに必要なもう 1 つの要素は、指定されたメッセージの書式設定方法を指定するエンコードです。 WCF には、次のエンコードが用意されています。
テキスト エンコード。相互運用可能なエンコード。
メッセージ送信最適化メカニズム (MTOM) エンコード。これは、サービスとの間で非構造化バイナリ データを効率的に送信するための相互運用可能な方法です。
効率的な転送のためのバイナリ エンコード。
WCF の組み込みの拡張ポイントを使用して、より多くのエンコード メカニズム (圧縮エンコードなど) を追加できます。
メッセージ パターン
WCF では、要求/応答、一方向、双方向の通信など、いくつかのメッセージング パターンがサポートされています。 トランスポートによってサポートされるメッセージング パターンが異なるので、サポートされる対話の種類に影響します。 WCF API とランタイムは、メッセージを安全かつ確実に送信するのにも役立ちます。
WCF の用語
WCF ドキュメントで使用されるその他の概念と用語は次のとおりです。
メッセージ
本文やヘッダーなど、複数の部分で構成できる自己完結型のデータ単位。
サービス
1 つ以上のエンドポイントを公開し、各エンドポイントが 1 つ以上のサービス操作を公開するコンストラクト。
エンドポイント
メッセージが送受信されるコンストラクト (またはその両方)。 メッセージを送信できる場所を定義する場所 (アドレス)、メッセージの送信方法を記述する通信メカニズム (バインディング) の仕様、およびその場所で送受信できるメッセージのセット (またはその両方) の定義 (サービス コントラクト) で構成され、送信できるメッセージを記述します。
WCF サービスは、エンドポイントのコレクションとして世界に公開されます。
アプリケーション エンドポイント
アプリケーションによって公開され、アプリケーションによって実装されるサービス コントラクトに対応するエンドポイント。
インフラストラクチャ エンドポイント
サービス コントラクトに関連しないサービスで必要または提供される機能を容易にするためにインフラストラクチャによって公開されるエンドポイント。 たとえば、サービスにメタデータ情報を提供するインフラストラクチャ エンドポイントがあるとします。
住所
メッセージを受信する場所を指定します。 URI (Uniform Resource Identifier) として指定されます。 URI スキーマ部分では、HTTP や TCP など、アドレスに到達するために使用するトランスポート メカニズムの名前が付けられます。 URI の階層部分には、形式がトランスポート メカニズムに依存する一意の場所が含まれています。
エンドポイント アドレスを使用すると、サービス内のエンドポイントごとに一意のエンドポイント アドレスを作成したり、特定の条件下でエンドポイント間でアドレスを共有したりできます。 次の例は、既定以外のポートで HTTPS プロトコルを使用するアドレスを示しています。
HTTPS://cohowinery:8005/ServiceModelSamples/CalculatorService
バインディング
エンドポイントが世界と通信する方法を定義します。 これは、通信インフラストラクチャを作成するために、一方を他方の上に "スタック" するバインディング要素と呼ばれる一連のコンポーネントで構成されます。 少なくとも、バインディングはトランスポート (HTTP や TCP など) と使用されるエンコード (テキストやバイナリなど) を定義します。 バインディングには、メッセージをセキュリティで保護するために使用されるセキュリティ メカニズムやエンドポイントで使用されるメッセージ パターンなどの詳細を指定するバインディング要素を含めることができます。 詳細については、「サービスの 構成」を参照してください。
結合要素
トランスポート、エンコード、インフラストラクチャ レベルプロトコル (WS-ReliableMessagingなど) の実装、または通信スタックのその他のコンポーネントなど、バインディングの特定の部分を表します。
動作
サービス、エンドポイント、特定の操作、またはクライアントのさまざまな実行時の側面を制御するコンポーネント。 動作はスコープに従ってグループ化されます。一般的な動作はすべてのエンドポイントにグローバルに影響し、サービスの動作はサービス関連の側面にのみ影響し、エンドポイントの動作はエンドポイント関連のプロパティにのみ影響し、操作レベルの動作は特定の操作に影響します。 たとえば、1 つのサービス動作は調整です。これは、過剰なメッセージが処理機能を圧倒する恐れがある場合にサービスがどのように反応するかを指定します。 一方、エンドポイントの動作では、セキュリティ資格情報を検索する方法や場所など、エンドポイントに関連する側面のみを制御します。
システム提供のバインド
WCF には、システム指定のバインドが多数含まれています。 これらは、特定のシナリオ用に最適化されたバインド要素のコレクションです。 たとえば、 WSHttpBinding は、さまざまな WS-* 仕様を実装するサービスとの相互運用性のために設計されています。 これらの定義済みのバインドは、特定のシナリオに正しく適用できるオプションのみを提示することで、時間を節約します。 定義済みのバインドが要件を満たしていない場合は、独自のカスタム バインドを作成できます。
構成とコーディング
アプリケーションの制御は、コーディング、構成、または両方の組み合わせによって行うことができます。 構成には、コードの記述後に再コンパイルしなくても、開発者以外のユーザー (ネットワーク管理者など) がクライアントとサービスのパラメーターを設定できるという利点があります。 構成では、エンドポイント アドレスなどの値を設定できるだけでなく、エンドポイント、バインド、動作を追加できるようにすることで、さらに制御することもできます。 コーディングを使用すると、開発者はサービスまたはクライアントのすべてのコンポーネントを厳密に制御でき、構成を通じて行われるすべての設定を検査し、必要に応じてコードによってオーバーライドすることができます。
サービス操作
操作の機能を実装するサービスのコードで定義されているプロシージャ。 この操作は、WCF クライアントのメソッドとしてクライアントに公開されます。 メソッドは値を返すことができ、省略可能な数の引数を受け取ったり、まったく引数を受け取らなかったり、応答を返さなかったりすることができます。 たとえば、単純な "Hello" として機能する操作を、クライアントのプレゼンスの通知として使用し、一連の操作を開始できます。
サービス コントラクト
複数の関連する操作を 1 つの機能単位に結び付けます。 コントラクトでは、サービスの名前空間、対応するコールバック コントラクト、その他の設定など、サービス レベルの設定を定義できます。 ほとんどの場合、コントラクトは、選択したプログラミング言語でインターフェイスを作成し、 ServiceContractAttribute 属性をインターフェイスに適用することによって定義されます。 実際のサービス コードは、インターフェイスを実装することによって得られます。
操作コントラクト
操作コントラクトは、操作のパラメーターと戻り値の型を定義します。 サービス コントラクトを定義するインターフェイスを作成するときは、コントラクトの一部である各メソッド定義に OperationContractAttribute 属性を適用することで、操作コントラクトを示します。 操作は、1 つのメッセージを取得して 1 つのメッセージを返すか、一連の型を受け取って型を返すようにモデル化できます。 後者の場合、システムは、その操作に交換する必要があるメッセージの形式を決定します。
メッセージ コントラクト
メッセージの形式について説明します。 たとえば、メッセージ要素をヘッダーと本文のどちらで使用するか、メッセージの要素にどのレベルのセキュリティを適用する必要があるかなどを宣言します。
障害コントラクト
呼び出し元に返すことができるエラーを示すために、サービス操作に関連付けることができます。 操作には、0 個以上のエラーを関連付けることができます。 これらのエラーは、プログラミング モデルの例外としてモデル化された SOAP エラーです。
データ コントラクト
サービスが使用するデータ型のメタデータの説明。 これにより、他のユーザーがサービスと相互運用できるようになります。 データ型は、パラメーターや戻り値の型など、メッセージの任意の部分で使用できます。 サービスで単純型のみを使用している場合、データ コントラクトを明示的に使用する必要はありません。
ホスティング
サービスは、何らかのプロセスでホストされている必要があります。
ホストは、サービスの有効期間を制御するアプリケーションです。 サービスは、既存のホスティング プロセスによってセルフホステッドまたは管理できます。
セルフホステッド サービス
開発者が作成したプロセス アプリケーション内で実行されるサービス。 開発者は、その有効期間を制御し、サービスのプロパティを設定し、サービスを開き (リッスン モードに設定します)、サービスを閉じます。
ホスティング プロセス
サービスをホストするように設計されたアプリケーション。 これには、インターネット インフォメーション サービス (IIS)、Windows ライセンス認証サービス (WAS)、および Windows サービスが含まれます。 これらのホストされるシナリオでは、ホストはサービスの有効期間を制御します。 たとえば、IIS を使用して、サービス アセンブリと構成ファイルを含む仮想ディレクトリを設定できます。 メッセージを受信すると、IIS はサービスを開始し、その有効期間を制御します。
インスタンス化の
サービスにはインスタンス化モデルがあります。 3 つのインスタンス化モデルがあります。"単一" では、1 つの CLR オブジェクトがすべてのクライアントにサービスを提供します。各クライアント呼び出しを処理する新しい CLR オブジェクトが作成されます。と "セッションごと"。CLR オブジェクトのセットが作成されます。これは、個別のセッションごとに 1 つずつです。 インスタンス化モデルの選択は、アプリケーションの要件とサービスの予想される使用パターンによって異なります。
クライアント アプリケーション
1 つ以上のエンドポイントとメッセージを交換するプログラム。 クライアント アプリケーションは、まず WCF クライアントのインスタンスを作成し、WCF クライアントのメソッドを呼び出します。 1 つのアプリケーションがクライアントとサービスの両方になることに注意することが重要です。
チャネル
バインド要素の具象実装。 バインディングは構成を表し、チャネルはその構成に関連付けられている実装です。 そのため、各バインド要素に関連付けられたチャネルがあります。 チャネルは互いに重なって、バインディングの具象実装であるチャネル スタックを作成します。
WCF クライアント
サービス操作をメソッドとして公開するクライアント アプリケーションコンストラクト (Visual Basic や Visual C# など、選択した .NET Framework プログラミング言語)。 サービスをホストするアプリケーションを含め、任意のアプリケーションで WCF クライアントをホストできます。 そのため、他のサービスの WCF クライアントを含むサービスを作成できます。
WCF クライアントは、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用して、メタデータを発行する実行中のサービスをポイントすることによって自動的に生成できます。
メタデータ
サービスでは、外部エンティティがサービスと通信するために理解する必要があるサービスの特性について説明します。
メタデータは ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によって使用され、WCF クライアントと、クライアント アプリケーションがサービスとの対話に使用できる付随する構成を生成できます。
サービスによって公開されるメタデータには、サービスのデータ コントラクトを定義する XML スキーマ ドキュメントと、サービスのメソッドを記述する WSDL ドキュメントが含まれます。
有効にすると、サービスとそのエンドポイントを調べることで、WCF によってサービスのメタデータが自動的に生成されます。 サービスからメタデータを発行するには、メタデータの動作を明示的に有効にする必要があります。
セキュリティ
WCF では、機密性 (傍受を防ぐためのメッセージの暗号化)、整合性 (メッセージの改ざんを検出する手段)、認証 (サーバーとクライアントの検証手段)、承認 (リソースへのアクセス制御) が含まれます。 これらの機能は、TLS over HTTP (HTTPS とも呼ばれます) などの既存のセキュリティ メカニズムを利用するか、さまざまな WS-* セキュリティ仕様の 1 つ以上を実装することによって提供されます。
トランスポート セキュリティ モード
機密性、整合性、および認証がトランスポート層メカニズム (HTTPS など) によって提供されることを指定します。 HTTPS のようなトランスポートを使用する場合、このモードはパフォーマンスが効率的であるという利点があり、インターネット上での普及のために十分に理解されています。 欠点は、この種のセキュリティが通信パスの各ホップに個別に適用され、通信が "中間者" 攻撃の影響を受けやすくなります。
メッセージ セキュリティ モード
Web Services Security: SOAP Message Security という名前の仕様など、1 つ以上のセキュリティ仕様を実装することによってセキュリティを提供することを指定します。 各メッセージには、転送中にセキュリティを提供し、受信者が改ざんを検出してメッセージを復号化できるようにするために必要なメカニズムが含まれています。 この意味で、セキュリティはすべてのメッセージ内にカプセル化され、複数のホップにわたってエンドツーエンドのセキュリティが提供されます。 セキュリティ情報はメッセージの一部になるため、メッセージに複数の種類の資格情報を含めることもできます (これらは クレームと呼ばれます)。 この方法には、メッセージが配信元と送信先の間の複数のトランスポートを含め、すべてのトランスポートを安全に移動できるという利点もあります。 この方法の欠点は、使用される暗号化メカニズムの複雑さによって、パフォーマンスに影響が生じることです。
メッセージ資格情報セキュリティ モードでのトランスポート
トランスポート層を使用してメッセージの機密性、認証、整合性を提供しますが、各メッセージにはメッセージの受信者が必要とする複数の資格情報 (要求) を含めることができます。
WS-*
WCFで実装される、WS-SecurityやWS-ReliableMessagingなどのWebサービス(WS)仕様に対する簡略表現。