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
を作成してこれに内部チャネル リスナを渡す同様の実装があります。
トランスポート チャネルを使用する別の例として、「Transport: 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 クラスを拡張します。次に、System.ServiceModel.Channels.IChannel.GetProperty を使用して、少なくとも System.ServiceModel.Channels.BindingElement.Clone と ChannelProtectionRequirements を実装する必要があります。これにより、このバインディング要素の ChannelProtectionRequirements が返されます。詳細については、ChannelProtectionRequirements を参照してください。
Clone は、このバインディング要素の新しいコピーを返します。最善の方法としては、バインディング要素の作成者は基本の copy コンストラクタを呼び出す copy コンストラクタを使用して、Clone を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。
トランスポート バインディング要素
新しいトランスポート バインディング要素を作成するには、TransportBindingElement インターフェイスを拡張します。次に、少なくとも Clone メソッドと System.ServiceModel.Channels.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 メソッド、System.ServiceModel.Channels.MessageEncodingBindingElement.CreateMessageEncoderFactory メソッド、および System.ServiceModel.Channels.MessageEncodingBindingElement.MessageVersion プロパティを実装する必要があります。
- Clone. このバインディング要素の新しいコピーを返します。最善の方法としては、バインディング要素の作成者は基本の copy コンストラクタを呼び出す copy コンストラクタを使用して、Clone を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。
- CreateMessageEncoderFactory. MessageEncoderFactory を返します。これは、新しいエンコーダを実装する実際のクラスを識別するハンドルを提供し、MessageEncoder を拡張します。詳細については、MessageEncoderFactory、MessageEncoder の各トピックを参照してください。
- MessageVersion. このエンコーディングで使用する MessageVersion を返します。これは、使用する SOAP および WS-Addressing のバージョンを表します。
ユーザー定義エンコーディング バインディング要素のオプション メソッドとプロパティの完全な一覧については、MessageEncodingBindingElement を参照してください。
新しいバインディング要素の作成の詳細については、「ユーザー定義バインディングの作成」を参照してください。
チャネルのバインディング要素を作成したら、「チャネルの開発」のトピックに戻り、作成したバインディング要素で構成ファイルをサポートする必要性の有無、メタデータの公開をサポートする必要性の有無とその方法、およびバインディング要素を使用するユーザー定義のバインディングを作成する必要性の有無とその方法について確認します。