Language

IContractBehavior インターフェイス

定義

サービスまたはクライアント アプリケーションのコントラクトの実行時動作を拡張するために使用できるメソッドを実装します。

public interface class IContractBehavior
public interface IContractBehavior
type IContractBehavior = interface
Public Interface IContractBehavior
派生

例

次のコード例では、"シングルトン" 動作を提供する IInstanceProvider と呼ばれるカスタム ObjectProviderBehavior実装を想定しています。これは常に同じサービス インスタンスを返し、リサイクルしません。

インスタンス プロバイダーのカスタマイズを挿入するために、この例では、カスタム サービス インスタンス プロバイダーを挿入するSingletonBehaviorAttributeを実装するカスタム属性 (IContractBehavior) を実装する方法を示します。 また、IContractBehaviorAttribute コントラクトに使用をバインドするISampleServiceも実装します。

public class SingletonBehaviorAttribute : Attribute, IContractBehaviorAttribute, IContractBehavior
{

  #region IContractBehaviorAttribute Members

  public Type TargetContract
  {
    get { return typeof(ISampleService); }
  }

  #endregion

  #region IContractBehavior Members

  public void AddBindingParameters(ContractDescription description, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection parameters)
  {
    return;
  }

  public void ApplyClientBehavior(ContractDescription description, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
  {
    return;
  }

  public void ApplyDispatchBehavior(ContractDescription description, ServiceEndpoint endpoint, DispatchRuntime dispatch)
  {
    dispatch.InstanceProvider = new ObjectProviderBehavior("Custom ObjectProviderBehavior constructor.");
  }

  public void Validate(ContractDescription description, ServiceEndpoint endpoint)
  {
    return;
  }

  #endregion
}

注釈

IContractBehavior インターフェイスを実装して、コントラクト全体の実行の一部の側面をアプリケーション レベルで変更、確認、または拡張します。 IServiceBehaviorオブジェクトやIEndpointBehavior オブジェクトとは異なり、IContractBehavior オブジェクトは、アプリケーション構成ファイルを使用してランタイムに追加することはできません。プログラムまたは属性を使用してのみ追加できます。

サービス、エンドポイント、コントラクトの動作の選択の詳細については、「ビヘイビアーを使用 したランタイムの構成と拡張」を参照してください。

  • AddBindingParameters メソッドを使用して、動作をサポートするカスタム データをバインド要素に提供します。

  • ApplyClientBehavior メソッドを使用して、クライアント アプリケーションのコントラクトに対する拡張機能を変更、確認、または挿入します。

  • ApplyDispatchBehavior メソッドを使用して、サービス アプリケーション内のコントラクトに対する拡張機能を変更、確認、または挿入します。

  • Validateメソッドを使用して、コントラクトが特定の機能をサポートできることを確認します。

IContractBehavior オブジェクトはこれらのメソッドのいずれかを使用できますが、多くの場合、重要なのは 1 つだけです。このような場合、未使用のメソッドは値なしで返すことができます。

Note

すべての IContractBehavior メソッドは、パラメーターとして System.ServiceModel.Description.ContractDescription と System.ServiceModel.Description.ServiceEndpoint を渡します。 これらのパラメータは検査用です。オブジェクトを変更する場合、実行動作は未定義です。

IContractBehavior 型は、サービスまたはクライアントのいずれか、またはその両方で使用できます。 サービスに対してカスタマイズ タスクを実行するには、サービス ランタイムを構築する前に、IContractBehavior オブジェクトを Behaviors プロパティに追加する必要があります。これは、ICommunicationObject.Open オブジェクトに対して System.ServiceModel.ServiceHost メソッドが呼び出されたときに発生します。 これには、2 つの方法があります。

1 つ目のメソッドは、Behaviors オブジェクトで ICommunicationObject.Open メソッドが呼び出される前に、System.ServiceModel.ServiceHost プロパティにカスタム コントラクト動作をプログラムで追加することです。 この方法で適用すると、任意のエンドポイントでコントラクトを通過するすべてのメッセージに対して動作が適用されます。

Note

動作は、同じ型のすべてのコントラクトに適用されます。 たとえば、プログラムによって同じコントラクトの種類を複数のエンドポイントに追加すると、動作によって、同じコントラクト オブジェクトを参照するすべてのエンドポイントが変更されます。

2 つ目の方法は、 IContractBehavior を実装し、次に適用するカスタム属性を作成する方法です。

  • コントラクト インターフェイス。 この場合、動作は任意のエンドポイントでその種類のすべてのコントラクトに適用されます。

  • サービス クラス。 この場合、コントラクトに関係なく、すべてのエンドポイントに動作が適用されます。

  • コールバック クラス。 この場合、動作は双方向クライアントのエンドポイントに適用されます。

カスタム属性で System.ServiceModel.Description.IContractBehaviorAttributeも実装されている場合、2 番目の方法の動作は若干異なります。 この場合の動作は次のとおりです。

  • コントラクト インターフェイス。 この場合、動作は任意のエンドポイントでその種類のすべてのコントラクトに適用され、Windows Communication Foundation (WCF) は IContractBehaviorAttribute.TargetContract プロパティの値を無視します。

  • サービス クラス。 この場合、動作は、コントラクトが IContractBehaviorAttribute.TargetContract プロパティの値であるエンドポイントにのみ適用されます。

  • コールバック クラス。 この場合、動作は双方向クライアントのエンドポイントに適用され、WCF は IContractBehaviorAttribute.TargetContract プロパティの値を無視します。

目的のクライアントでカスタマイズ タスクを実行するには、クライアント ランタイムを構築する前に、 IContractBehavior オブジェクトを Behaviors プロパティに追加する必要があります。これは、 ChannelFactory<TChannel>.CreateChannel が呼び出されたときに発生します。 これを行うには、次の 2 つの方法があります。

クライアントまたはサービス アプリケーションに IContractBehavior 型をプログラムで追加する方法の詳細については、「動作を使用 したランタイムの構成と拡張」を参照してください。

メソッド

Name 説明
AddBindingParameters(ContractDescription, ServiceEndpoint, BindingParameterCollection)

コントラクトの動作をサポートするようにバインディング要素を構成します。

ApplyClientBehavior(ContractDescription, ServiceEndpoint, ClientRuntime)

コントラクト全体でクライアントの変更または拡張を実装します。

ApplyDispatchBehavior(ContractDescription, ServiceEndpoint, DispatchRuntime)

コントラクト全体でクライアントの変更または拡張を実装します。

Validate(ContractDescription, ServiceEndpoint)

コントラクトとエンドポイントがコントラクトの動作をサポートできることを確認するために実装します。

適用対象