バインド要素とバインド要素 (それぞれ System.ServiceModel.Channels.Binding と System.ServiceModel.Channels.BindingElementを拡張するオブジェクト) は、Windows Communication Foundation (WCF) アプリケーション モデルがチャネル ファクトリとチャネル リスナーに関連付けられている場所です。 バインディングを使用しない場合、カスタム チャネルを使用するには、「 サービス Channel-Level プログラミング とクライアント Channel-Level プログラミング」で説明されているように、チャネル レベルでの プログラミングが必要です。 このトピックでは、「チャネルの開発」の手順 4 で説明されているように、WCF でのチャネルの使用、チャネルのBindingElementの開発、アプリケーションからの使用を有効にする最小要件について説明します。
概要
チャネルの 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 クラスを拡張します。 少なくとも、BindingElement.Cloneを実装し、ChannelProtectionRequirements
を使用してIChannel.GetPropertyを実装する必要があります。 これにより、このバインド要素の ChannelProtectionRequirements が返されます。 詳細については、ChannelProtectionRequirementsを参照してください。
Clone は、このバインド要素の新しいコピーを返す必要があります。 ベスト プラクティスとして、バインディング要素の作成者は、基本コピー コンストラクターを呼び出すコピー コンストラクターを使用して Clone を実装し、このクラスの追加フィールドを複製することをお勧めします。
トランスポート バインド要素
新しいトランスポート バインド要素を作成するには、 TransportBindingElement インターフェイスを拡張します。 少なくとも、 Clone メソッドと TransportBindingElement.Scheme プロパティを実装する必要があります。
Clone – この Binding 要素の新しいコピーを返す必要があります。 ベスト プラクティスとして、Binding 要素の作成者は、基本コピー コンストラクターを呼び出すコピー コンストラクターを使用して Clone を実装し、このクラスの追加フィールドを複製することをお勧めします。
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。 このバインド要素の新しいコピーを返します。 ベスト プラクティスとして、バインディング要素の作成者は、基本コピー コンストラクターを呼び出すコピー コンストラクターを使用して Clone を実装し、このクラスの追加フィールドを複製することをお勧めします。
CreateMessageEncoderFactory。 新しいエンコーダーを実装し、MessageEncoderFactoryを拡張する必要がある実際のクラスへのハンドルを提供するMessageEncoderを返します。 詳細については、「MessageEncoderFactory と MessageEncoder」を参照してください。
MessageVersion。 このエンコードで使用される MessageVersion を返します。これは、使用中の SOAP と WS-Addressing のバージョンを表します。
ユーザー定義のエンコード バインド要素の省略可能なメソッドとプロパティの完全な一覧については、 MessageEncodingBindingElementを参照してください。
新しいバインド要素の作成の詳細については、「 User-Defined バインドの作成」を参照してください。
チャネルのバインド要素を作成したら、「 チャネルの開発 」トピックに戻り、構成ファイルのサポートをバインド要素に追加するかどうか、メタデータパブリケーションのサポートを追加する場合と追加する方法、およびバインド要素を使用するユーザー定義バインディングを作成するかどうか、およびその方法を確認します。