次の方法で共有


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
}
Public Class SingletonBehaviorAttribute
    Inherits Attribute
    Implements IContractBehaviorAttribute, IContractBehavior

  #Region "IContractBehaviorAttribute Members"

  Public ReadOnly Property TargetContract() As Type Implements IContractBehaviorAttribute.TargetContract
    Get
        Return GetType(ISampleService)
    End Get
  End Property

  #End Region

  #Region "IContractBehavior Members"

  Public Sub AddBindingParameters(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint, ByVal parameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IContractBehavior.AddBindingParameters
    Return
  End Sub

  Public Sub ApplyClientBehavior(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint, ByVal clientRuntime As ClientRuntime) Implements IContractBehavior.ApplyClientBehavior
    Return
  End Sub

  Public Sub ApplyDispatchBehavior(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint, ByVal dispatch As DispatchRuntime) Implements IContractBehavior.ApplyDispatchBehavior
    dispatch.InstanceProvider = New ObjectProviderBehavior("Custom ObjectProviderBehavior constructor.")
  End Sub

  Public Sub Validate(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint) Implements IContractBehavior.Validate
    Return
  End Sub

  #End Region
End Class

注釈

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

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

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

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

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

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

IContractBehavior オブジェクトは、これらのメソッドをどれでも使用できますが、通常は、重要なメソッドは 1 つだけです。この場合、使用されないメソッドは、値なしで戻ることができます。

注意

すべての 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 プロパティにコントラクトのカスタム動作を追加する方法です。 この場合、動作は、エンドポイント上でそのコントラクトを使用して送信されるすべてのメッセージに適用されます。

注意

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

もう 1 つは、IContractBehavior を実装するカスタム属性を作成し、それを次のものに適用する方法です。

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

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

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

カスタム属性が System.ServiceModel.Description.IContractBehaviorAttribute を同時に実装している場合、2 番目の方法の動作は少し異なります。 この場合、動作は次のようになります。

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

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

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

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

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

メソッド

AddBindingParameters(ContractDescription, ServiceEndpoint, BindingParameterCollection)

任意のバインド要素を、コントラクトの動作をサポートするように構成します。

ApplyClientBehavior(ContractDescription, ServiceEndpoint, ClientRuntime)

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

ApplyDispatchBehavior(ContractDescription, ServiceEndpoint, DispatchRuntime)

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

Validate(ContractDescription, ServiceEndpoint)

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

適用対象