BindingElement の作成

バインディングとバインド要素 (それぞれ、System.ServiceModel.Channels.BindingSystem.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 クラスを拡張します。次に、System.ServiceModel.Channels.IChannel.GetProperty を使用して、少なくとも System.ServiceModel.Channels.BindingElement.CloneChannelProtectionRequirements を実装する必要があります。これにより、このバインド要素の ChannelProtectionRequirements が返されます。詳細については、ChannelProtectionRequirements を参照してください。

Clone は、このバインド要素の新しいコピーを返します。最善の方法としては、バインド要素の作成者は基本の copy コンストラクターを呼び出す copy コンストラクターを使用して、Clone を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。

トランスポート バインド要素

新しいトランスポート バインド要素を作成するには、TransportBindingElement インターフェイスを拡張します。次に、少なくとも Clone メソッドと System.ServiceModel.Channels.TransportBindingElement.Scheme プロパティを実装する必要があります。

Clone - このバインド要素の新しいコピーを返します。最善の方法としては、バインド要素の作成者は基本の copy コンストラクターを呼び出す copy コンストラクターを使用して、複製を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。

SchemeScheme 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 を実装し、このクラスに含まれるすべての追加フィールドを複製することをお勧めします。

  • CreateMessageEncoderFactoryMessageEncoderFactory を返します。これは、新しいエンコーダーを実装する実際のクラスを識別するハンドルを提供し、MessageEncoder を拡張します。詳細については、MessageEncoderFactoryMessageEncoder の各トピックを参照してください。

  • MessageVersion。このエンコーディングで使用する MessageVersion を返します。これは、使用する SOAP および WS-Addressing のバージョンを表します。

ユーザー定義エンコーディング バインド要素のオプション メソッドとプロパティの完全な一覧については、MessageEncodingBindingElement を参照してください。

新しいバインド要素の作成の詳細については、「ユーザー定義バインディングの作成」を参照してください。

チャネルのバインド要素を作成したら、「チャネルの開発」のトピックに戻り、作成したバインド要素で構成ファイルをサポートする必要性の有無、メタデータの公開をサポートする必要性の有無とその方法、およびバインド要素を使用するユーザー定義のバインディングを作成する必要性の有無とその方法について確認します。

参照

処理手順

トランスポート: UDP

リファレンス

BindingElement

概念

チャネルの開発