IContractBehavior Interfaz

Definición

Implementa métodos que pueden utilizarse para extender el comportamiento de tiempo de ejecución de un contrato en un servicio o aplicación cliente.

public interface class IContractBehavior
public interface IContractBehavior
type IContractBehavior = interface
Public Interface IContractBehavior
Derivado

Ejemplos

El ejemplo de código siguiente supone que una implementación IInstanceProvider personalizada, llamada ObjectProviderBehavior, que proporciona un comportamiento "singleton", siempre devuelve la misma instancia del servicio y no lo recicla.

Para insertar la personalización del proveedor de instancias, el ejemplo muestra cómo implementar un atributo personalizado (SingletonBehaviorAttribute) que implementa IContractBehavior para insertar el proveedor de instancias del servicio personalizado. También implementa IContractBehaviorAttribute, que enlaza su utilización al contrato 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

Comentarios

Implemente la interfaz IContractBehavior para modificar, examinar o extender algún aspecto de ejecución de todo el contrato en el nivel de la aplicación. A diferencia de IServiceBehavior y los objetos IEndpointBehavior, los objetos IContractBehavior no se pueden agregar al tiempo de ejecución utilizando un archivo de configuración de la aplicación; sólo pueden agregarse mediante programación o utilizando un atributo.

Para obtener más información sobre cómo elegir entre los comportamientos de servicio, punto de conexión y contrato, consulte Configuración y extensión del tiempo de ejecución con comportamientos.

  • Utilice el método AddBindingParameters para proporcionar los datos personalizados a los elementos de enlace y que admitan el comportamiento.

  • Utilice el método ApplyClientBehavior para modificar, examinar o insertar extensiones en un contrato de una aplicación cliente.

  • Utilice el método ApplyDispatchBehavior para modificar, examinar o insertar extensiones en un contrato de una aplicación de servicio.

  • Utilice el método Validate para asegurarse de que un contrato puede admitir una característica determinada.

Los objetos IContractBehavior pueden utilizar cualquiera de estos métodos, pero a menudo sólo uno es importante; en ese caso, los métodos no usados pueden ser devueltos sin ningún valor.

Nota

Todos los métodos IContractBehavior pasan System.ServiceModel.Description.ContractDescription y System.ServiceModel.Description.ServiceEndpoint como parámetros. Estos parámetros se utilizan para realizar un examen; si modifica los objetos el comportamiento de la ejecución no estará definido.

IContractBehavior Los tipos se pueden usar en el servicio o en el cliente, o en ambos. Para realizar una tarea de personalización en el servicio, debe agregarse el objeto IContractBehavior a la propiedad Behaviors antes de la construcción del runtime del servicio, lo que sucede cuando se llama al método ICommunicationObject.Open en el objeto System.ServiceModel.ServiceHost. Existen dos formas de hacerlo.

El primer método es agregar mediante programación el comportamiento del contrato personalizado a la propiedad Behaviors antes de llamar al método ICommunicationObject.Open en el objeto System.ServiceModel.ServiceHost. Cuando se utiliza esta opción, el comportamiento se aplica a todos los mensajes que fluyen a través de ese contrato en cualquier punto de conexión.

Nota

El comportamiento se aplica a todos los contratos del mismo tipo. Por ejemplo, si agrega mediante programación el mismo tipo de contrato a más de un punto de conexión, el comportamiento modifica todos los puntos de conexión que hacen referencia al mismo objeto de contrato.

El segundo método es crear un atributo personalizado que implementa IContractBehavior y lo aplica a:

  • Una interfaz de contrato. En este caso, el comportamiento se aplica a todos los contratos de ese tipo en cualquier punto de conexión.

  • Una clase de servicio En este caso, el comportamiento se aplica a todos los puntos de conexión sin tener en cuenta el contrato.

  • Una clase de devolución de llamada. En este caso, el comportamiento se aplica al extremo del cliente dúplex.

El comportamiento del segundo enfoque varía ligeramente si el atributo personalizado también implementa System.ServiceModel.Description.IContractBehaviorAttribute. En este caso, el comportamiento es el siguiente:

  • Una interfaz de contrato. En este caso, el comportamiento se aplica a todos los contratos de ese tipo en cualquier punto de conexión y Windows Communication Foundation (WCF) omite el valor de la IContractBehaviorAttribute.TargetContract propiedad .

  • Una clase de servicio En este caso, el comportamiento se aplica solo a los puntos de conexión cuyo contrato es el valor de la propiedad IContractBehaviorAttribute.TargetContract.

  • Una clase de devolución de llamada. En este caso, el comportamiento se aplica al punto de conexión del cliente dúplex y WCF omite el valor de la IContractBehaviorAttribute.TargetContract propiedad .

Para realizar la tarea de personalización en el cliente para el que está prevista, debe agregarse el objeto IContractBehavior a la propiedad Behaviors antes de la construcción del runtime del cliente, lo que sucede al llamar a ChannelFactory<TChannel>.CreateChannel. Existen dos formas de hacerlo:

Para obtener más información sobre cómo agregar IContractBehavior tipos mediante programación a la aplicación cliente o de servicio, consulte Configuración y extensión del entorno de ejecución con comportamientos.

Métodos

AddBindingParameters(ContractDescription, ServiceEndpoint, BindingParameterCollection)

Configura cualquier elemento de enlace para admitir el comportamiento del contrato.

ApplyClientBehavior(ContractDescription, ServiceEndpoint, ClientRuntime)

Implementa una modificación o extensión del cliente en este contrato.

ApplyDispatchBehavior(ContractDescription, ServiceEndpoint, DispatchRuntime)

Implementa una modificación o extensión del cliente en este contrato.

Validate(ContractDescription, ServiceEndpoint)

Implemente para confirmar que el contrato y punto de conexión pueden admitir el comportamiento del contrato.

Se aplica a