バインディングとバインディング要素
バインディングは、バインディング要素と呼ばれる特殊な構成要素のコレクションであり、クライアント エンドポイントまたはサービス エンドポイントが構築されるたびにサービス ランタイムによって評価されます。バインディング内のバインディング要素の型と順序に基づいて、エンドポイントのチャネル スタック内のプロトコル チャネルとトランスポート チャネルが選択され、スタック順が決定されます。
また、バインディング (特に、システム指定のバインディング) は、通常、多数の構成プロパティを持ちますが、これらはカプセル化されたバインディング要素の最も頻繁に変更されたプロパティを反映します。
バインディングには、トランスポート バインディング要素が 1 つだけ含まれている必要があります。各トランスポート バインディング要素は、1 つのメッセージ エンコード バインディング要素をバインディングに追加することによってオーバーライドできる既定のメッセージ エンコード バインディング要素です。トランスポート バインディング要素とエンコーダ バインディング要素に加えて、バインディングには任意の数のプロトコル バインディング要素を含めることもできます。この要素により、サービスに必要な機能を実装し、エンドポイント間で SOAP メッセージを送信することができます。詳細については、「サービスとクライアントを構成するためのバインディングの使用」を参照してください。
バインディングとバインディング要素の拡張
Windows Communication Foundation (WCF) には、広範なシナリオをカバーするシステム指定のバインディングが用意されています (詳細については、「システム標準のバインディング」を参照してください)。ただし、WCF に用意されていないバインディングを作成し、使用することが必要になる場合もあります。次のシナリオでは、新しいバインディングを作成する必要があります。
- 新しいバインディング要素 (新しいトランスポート バインディング要素、エンコード バインディング要素、またはプロトコル バインディング要素) を使用する場合。そのバインディング要素を含む新しいバインディングを作成する必要があります。たとえば、UDP トランスポートのためのカスタム
UdpTransportBindingElement
を追加した場合は、そのカスタム バインディング要素を使用する新しいバインディングを作成する必要があります。System.ServiceModel.Channels.CustomBinding 型を使用してこの動作を実行する方法については、「カスタム バインディング」を参照してください。 - パブリック プロパティでシステム指定のバインディングが公開されないように既存のバインディング要素を構成する場合。たとえば、署名操作と暗号化操作の実行順序を変更するには、新しいバインディングを作成する必要があります。この動作を実行する方法については、「方法 : システム指定のバインディングをカスタマイズする」を参照してください。
- 特定の構成オプションだけを公開する、企業の標準バインディングを確立する場合。たとえば、社内用にセキュリティを無効にできない WSHttpBinding のバリエーションを作成するには、WSHttpBinding のように動作し、セキュリティが常に有効になる新しいバインディングを作成します。詳細については、「ユーザー定義バインディングの作成」を参照してください。
- 特定のカスタム バインディング要素を状況に応じて構成または使用するようにメタデータをカスタマイズする場合。バインディングとバインディング要素に対するメタデータのサポートの詳細については、「構成とメタデータのサポート」を参照してください。
チャネル、バインディング、およびバインディング要素
バインディングとバインディング要素は、属性と動作を含むアプリケーション プログラミング モデルと、ファクトリとリスナ、メッセージ エンコーダ、およびトランスポートとプロトコルの実装を含むチャネル モデルを結び付けます。通常、バインディング要素とバインディングは、アプリケーション層で使用されるチャネルを有効にするために実装されます。
チャネル層は、サービス層との間でメッセージを送受信し、そのメッセージをエンドポイント間で転送します。クライアントでは、チャネル層はネットワーク エンドポイントへのチャネルを作成するチャネル ファクトリのスタックです。サービスでは、チャネル層はネットワーク エンドポイントで受信されたチャネルを受け入れるチャネル リスナのスタックです。
一般的なチャネルの種類としては、プロトコル チャネルとトランスポート チャネルの 2 つがあります。トランスポート チャネルの役割は、ネットワーク エンドポイント間でメッセージを実際に転送することです。トランスポート チャネルは、既定のメッセージ エンコーダを持ち、メッセージ エンコーダ バインディング要素を通じて供給される代替のメッセージ エンコーダを使用できる必要があります。メッセージ エンコーダには、System.ServiceModel.Channels.Message をネットワーク上の表現に (またはその逆方向に) 変換する役割があります。プロトコル チャネルの役割は、SOAP レベルのプロトコル (たとえば、WS-Security や WS-ReliableMessaging) を実装することです。
トランスポート チャネルとプロトコル チャネルの主要要件は、必要なチャネル インターフェイスを実装することです。正常に機能するチャネル層を作成するには、ファクトリとリスナを関連付ける必要があります。WCF でチャネルの実装を使用するには、チャネルごとに BindingElement から派生したバインディング要素が関連付けられている必要があります。また、BindingElementExtensionElement から派生する関連バインディング拡張要素を構成ファイルに含める必要もあります。
前述のように、メッセージ エンコーダ チャネル、プロトコル チャネル、およびトランスポート チャネルの実装に使用されるバインディング要素をスタックすることによりチャネル スタックを形成できます。バインディングは、これらを順序付きセットに並べ替えるための機構です。バインディングとバインディング要素は、アプリケーション プログラミング モデルをチャネル モデルに結び付けます。チャネルの実装をコードから直接使用することもできますが、エンコーダ、トランスポート、およびプロトコルがバインディング要素として実装されていない限り、サービス層プログラミング モデルから使用できません。
チャネルとそのバインディング要素の開発の詳細については、「チャネル レイヤの拡張」を参照してください。