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 接口可以在应用程序级别修改、检查或扩展协定范围内的执行的某个方面。 与 IServiceBehaviorIEndpointBehavior 对象不同,IContractBehavior 对象是不能通过使用应用程序配置文件添加到运行时的,而只能通过编程方式或使用属性来添加。

有关在服务、终结点和协定行为之间进行选择的详细信息,请参阅 使用行为配置和扩展运行时

  • 使用 AddBindingParameters 方法可以向绑定元素提供自定义数据,从而支持该行为。

  • 使用 ApplyClientBehavior 方法可以修改、检查客户端应用程序的协定中的扩展,或向该协定中插入扩展。

  • 使用 ApplyDispatchBehavior 方法可以修改、检查服务应用程序的协定中的扩展,或向该协定中插入扩展。

  • 使用 Validate 方法可以确保协定可以支持特定功能。

IContractBehavior 对象可使用所有这些方法,但通常只有一种方法是重要的,在这种情况下,未被使用的方法可不带值返回。

备注

所有 IContractBehavior 方法会将 System.ServiceModel.Description.ContractDescriptionSystem.ServiceModel.Description.ServiceEndpoint 作为参数传递。 这些参数只用于检查;如果您修改了这些对象,则执行行为将是不确定的。

IContractBehavior 类型可用于服务或客户端,也可以同时用于两者。 若要在服务上执行自定义任务,则必须先将 IContractBehavior 对象添加到 Behaviors 属性,然后构造服务运行时,该构造操作是在对 ICommunicationObject.Open 对象调用 System.ServiceModel.ServiceHost 方法时进行的。 可通过两种方式来执行此操作。

第一种方法是通过编程方式,对 Behaviors 对象调用 ICommunicationObject.Open 方法前,将自定义协定行为添加到 System.ServiceModel.ServiceHost 属性。 应用此方法时,该行为将应用于流经任何终结点的该协定的所有消息。

备注

该行为会应用到同一类型的所有协定。 例如,如果通过编程方式将同一协定类型添加到多个终结点,则该行为将修改引用同一协定对象的所有终结点。

第二种方法是创建可实现 IContractBehavior 的自定义属性,并将其应用到:

  • 一个协定接口。 在此情况下,该行为将应用到所有终结点中该类型的所有协定。

  • 一个服务类。 在此情况下,该行为将应用到所有终结点,而不管协定类型如何。

  • 一个回调类。 在此情况下,该行为将应用到双向客户端的终结点。

对于第二种方法,如果自定义属性还要实现 System.ServiceModel.Description.IContractBehaviorAttribute,则其行为将会稍有不同。 在此情况下,该行为如下:

若要在客户端执行自定义计划任务,则必须先将 IContractBehavior 对象添加到 Behaviors 属性,然后构造客户端运行时,该构造操作是在调用 ChannelFactory<TChannel>.CreateChannel 时进行的。 有两种方法可以实现此目的:

有关以编程方式 IContractBehavior 将类型添加到客户端或服务应用程序的详细信息,请参阅 使用行为配置和扩展运行时

方法

AddBindingParameters(ContractDescription, ServiceEndpoint, BindingParameterCollection)

配置所有绑定元素以支持协定行为。

ApplyClientBehavior(ContractDescription, ServiceEndpoint, ClientRuntime)

在协定范围内执行客户端的修改或扩展。

ApplyDispatchBehavior(ContractDescription, ServiceEndpoint, DispatchRuntime)

在协定范围内执行客户端的修改或扩展。

Validate(ContractDescription, ServiceEndpoint)

实现此方法可以确认协定和终结点是否支持协定行为。

适用于