BindingElement の作成
バインディングとバインド要素 (それぞれ、System.ServiceModel.Channels.Binding と System.ServiceModel.Channels.BindingElement を拡張するオブジェクト) は、Windows Communication Foundation (WCF) アプリケーション モデルがチャネル ファクトリおよびチャネル リスナーと関連付けられる場所です。 バインディングがないと、カスタム チャネルを使用するとき、チャネル レベルでのプログラミングが必要になります。詳細については、「サービス チャネルレベルのプログラミング」と「クライアント チャネルレベルのプログラミング」にあります。 このトピックでは、WCF でチャネルを使用するための最小要件、チャネルの BindingElement の開発、および「チャネルの開発」の手順 4. に示す "アプリケーションからのチャネル使用" を有効にする方法について説明します。
概要
チャネルの BindingElement を作成しておくと、開発者は WCF アプリケーション内でチャネルを使用できるようになります。 BindingElement オブジェクトを System.ServiceModel.ServiceHost クラスから使用することにより、チャネルの正確な型情報を指定しなくても WCF アプリケーションをチャネルに接続できます。
一度 BindingElement を作成しておくと、「チャネルの開発」に示す残りのチャネル開発手順に従って、さらに多くの機能を、要件に応じて有効にできます。
バインド要素の追加
カスタムの BindingElement を実装するには、BindingElement を継承するクラスを記述します。 たとえば、サイズの大きいメッセージをチャンクに分割し、接続先で元のメッセージを再構築できる ChunkingChannel
を開発している場合、BindingElement を実装してこれを使用するようにバインディングを構成することによって、任意のバインディングでこのチャネルを使用できるようになります。 このトピックの残りの部分では、ChunkingChannel
を例にして、バインド要素を実装する際の要件を示します。
ChunkingBindingElement
は、ChunkingChannelFactory
および ChunkingChannelListener
を作成します。 このバインド要素は、CanBuildChannelFactory 実装および CanBuildChannelListener 実装をオーバーライドし、型パラメーターが IDuplexSessionChannel (この例では、これが ChunkingChannel
でサポートされる唯一のチャネル形状です) であることと、バインディングの他のバインド要素がこのチャネル形状をサポートすることを確認します。
BuildChannelFactory は、要求されたチャネル形状を構築できることをまず確認し、次にチャンク対象のメッセージ アクションのリストを取得します。 さらに、新しい ChunkingChannelFactory
を作成してこれに内部チャネル ファクトリを渡します (トランスポート バインド要素を作成する場合、これはバインディング スタック内の最後の要素となるため、チャネル リスナーとチャネル ファクトリを作成する必要があります)。
BuildChannelListener には、ChunkingChannelListener
を作成してこれに内部チャネル リスナーを渡す同様の実装があります。
トランスポート チャネルを使用する別の例として、「トランスポート: UDP」のサンプルでは次のオーバーライドが示されています。
このサンプルでは、バインド要素は UdpTransportBindingElement
で、TransportBindingElement から派生しています。 このバインド要素は、チャネルに関連付けられているファクトリを作成する、次のメソッドをオーバーライドします。
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
また、この要素には、BindingElement
を複製したり、スキーム (soap.udp) を返したりするためのメンバーも含まれます。
プロトコル バインド要素
含まれているバインド要素を新しいバインド要素で置き換えたり補足したりすることにより、新しいトランスポート、エンコーディング、または高レベルのプロトコルを追加できます。 新しいプロトコル バインド要素を作成するには、まず BindingElement クラスを拡張します。 次に、IChannel.GetProperty を使用して、少なくとも BindingElement.Clone と ChannelProtectionRequirements
を実装する必要があります。 これにより、このバインド要素の ChannelProtectionRequirements が返されます。 詳細については、「ChannelProtectionRequirements」を参照してください。
Clone は、このバインド要素の新しいコピーを返します。 最善の方法としては、バインド要素の作成者は基本の copy コンストラクターを呼び出す copy コンストラクターを使用して、Clone を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。
トランスポート バインド要素
新しいトランスポート バインド要素を作成するには、TransportBindingElement インターフェイスを拡張します。 次に、少なくとも Clone メソッドと TransportBindingElement.Scheme プロパティを実装する必要があります。
Clone - このバインド要素の新しいコピーを返します。 最善の方法としては、バインド要素の作成者は基本の copy コンストラクターを呼び出す copy コンストラクターを使用して、複製を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。
Scheme – Scheme get プロパティは、バインド要素によって表されるトランスポート プロトコルの URI スキームを返します。 たとえば、System.ServiceModel.Channels.HttpTransportBindingElement および System.ServiceModel.Channels.TcpTransportBindingElement は、それぞれの Scheme プロパティから "http" および "net.tcp" を返します。
エンコーディング バインド要素
新しいエンコーディング バインド要素を作成するには、まず BindingElement クラスを拡張し、System.ServiceModel.Channels.MessageEncodingBindingElement クラスを実装します。 次に、少なくとも、Clone メソッド、MessageEncodingBindingElement.CreateMessageEncoderFactory メソッド、および MessageEncodingBindingElement.MessageVersion プロパティを実装する必要があります。
Clone。 このバインド要素の新しいコピーを返します。 最善の方法としては、バインド要素の作成者は基本の copy コンストラクターを呼び出す copy コンストラクターを使用して、Clone を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。
CreateMessageEncoderFactory. MessageEncoderFactory を返します。これは、新しいエンコーダーを実装する実際のクラスを識別するハンドルを提供し、MessageEncoder を拡張します。 詳細については、次のトピックを参照してください。 MessageEncoderFactory および MessageEncoder
MessageVersion. このエンコーディングで使用する MessageVersion を返します。これは、使用する SOAP および WS-Addressing のバージョンを表します。
ユーザー定義エンコーディング バインド要素のオプション メソッドとプロパティの完全な一覧については、MessageEncodingBindingElement を参照してください。
新しいバインディング要素の作成に関する詳細については、「ユーザー定義バインディングの作成」を参照してください。
チャネルのバインド要素を作成したら、「チャネルの開発」のトピックに戻り、作成したバインド要素で構成ファイルをサポートする必要性の有無、メタデータの公開をサポートする必要性の有無とその方法、およびバインド要素を使用するユーザー定義のバインディングを作成する必要性の有無とその方法について確認します。