Condividi tramite


IContractBehavior Interfaccia

Definizione

Implementa metodi che possono essere utilizzati per estendere il comportamento in fase di esecuzione per un contratto in un'applicazione client o del servizio.

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

Esempio

Nell'esempio di codice seguente si presuppone che un'implementazione personalizzata di IInstanceProvider denominata ObjectProviderBehavior, la quale fornisce un comportamento "Singleton", restituisca sempre la stessa istanza del servizio e non la ricicli.

Come illustrato nell'esempio, per applicare la personalizzazione del provider di istanze è possibile implementare un attributo personalizzato (SingletonBehaviorAttribute) che implementa l'interfaccia IContractBehavior al fine di inserire il provider di istanze del servizio personalizzato. Implementa inoltre IContractBehaviorAttribute, che associa l'utilizzo al contratto 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

Commenti

Implementare l'interfaccia IContractBehavior per modificare, esaminare o estendere alcuni aspetti dell'esecuzione del contratto a livello di applicazione. A differenza degli oggetti IServiceBehavior e IEndpointBehavior, gli oggetti IContractBehavior non possono essere aggiunti alla fase di esecuzione mediante un file di configurazione dell'applicazione, bensì solo a livello di programmazione o utilizzando un attributo.

Per altre informazioni sulla scelta tra i comportamenti di servizio, endpoint e contratto, vedere Configurazione ed estensione del runtime con comportamenti.

  • Utilizzare il metodo AddBindingParameters per fornire elementi di associazione con dati personalizzati per supportare il comportamento.

  • Utilizzare il metodo ApplyClientBehavior per modificare, esaminare o inserire estensioni in un contratto di un'applicazione client.

  • Utilizzare il metodo ApplyDispatchBehavior per modificare, esaminare o inserire estensioni in un contratto di un'applicazione del servizio.

  • Utilizzare il metodo Validate per accertarsi che un contratto sia in grado di supportare una determinata funzionalità.

Gli oggetti IContractBehavior possono utilizzare uno o più di questi metodi, ma spesso soltanto uno di essi è importante. In questi casi, è possibile che i metodi non utilizzati non restituiscano alcun valore.

Nota

Tutti i metodi IContractBehavior passano System.ServiceModel.Description.ContractDescription e System.ServiceModel.Description.ServiceEndpoint come parametri. Questi parametri sono utilizzabili a fini di esame. Se gli oggetti vengono modificati, il comportamento di esecuzione risulterà indefinito.

IContractBehavior I tipi possono essere usati nel servizio o nel client o in entrambi. Per eseguire un'attività di personalizzazione nel servizio, è necessario aggiungere l'oggetto IContractBehavior alla proprietà Behaviors prima della costruzione della fase di esecuzione del servizio, che si verifica quando il metodo ICommunicationObject.Open viene chiamato nell'oggetto System.ServiceModel.ServiceHost. Per eseguire questa operazione è possibile procedere in due modi:

Il primo consiste nell'aggiungere a livello di programmazione il comportamento del contratto personalizzato alla proprietà Behaviors prima che il metodo ICommunicationObject.Open venga chiamato nell'oggetto System.ServiceModel.ServiceHost. In questo caso, il comportamento viene applicato per tutti i messaggi che passano attraverso il contratto in qualsiasi endpoint.

Nota

Il comportamento viene applicato a tutti i contratti dello stesso tipo. Se ad esempio si aggiunge lo stesso tipo di contratto a livello di programmazione a più endpoint, il comportamento modifica tutti gli endpoint che fanno riferimento allo stesso oggetto contratto.

La seconda modalità consiste nel creare un attributo personalizzato che implementa IContractBehavior e applicarlo a:

  • Un'interfaccia di contratto. In questo caso, il comportamento viene applicato a tutti i contratti di quel tipo in qualsiasi endpoint.

  • Una classe di servizio. In questo caso, il comportamento viene applicato a tutti gli endpoint, indipendentemente dal contratto.

  • Una classe di callback. In questo caso, il comportamento viene applicato all'endpoint del client duplex.

Il comportamento ottenuto con il secondo approccio varia leggermente se l'attributo personalizzato implementa anche System.ServiceModel.Description.IContractBehaviorAttribute. In questo caso, il comportamento è il seguente:

  • Un'interfaccia di contratto. In questo caso, il comportamento viene applicato a tutti i contratti di quel tipo in qualsiasi endpoint e Windows Communication Foundation (WCF) ignora il valore della IContractBehaviorAttribute.TargetContract proprietà .

  • Una classe di servizio. In questo caso, il comportamento viene applicato solo agli endpoint il cui contratto corrisponde al valore della proprietà IContractBehaviorAttribute.TargetContract.

  • Una classe di callback. In questo caso, il comportamento viene applicato all'endpoint del client duplex e WCF ignora il valore della IContractBehaviorAttribute.TargetContract proprietà .

Per eseguire l'attività di personalizzazione sul client al quale è destinata, è necessario aggiungere l'oggetto IContractBehavior alla proprietà Behaviors prima della costruzione della fase di esecuzione del client, che si verifica quando viene chiamato il metodo ChannelFactory<TChannel>.CreateChannel. A questo scopo è possibile procedere in due modi:

Per altre informazioni sull'aggiunta IContractBehavior di tipi a livello di codice all'applicazione client o al servizio, vedere Configurazione ed estensione del runtime con comportamenti.

Metodi

AddBindingParameters(ContractDescription, ServiceEndpoint, BindingParameterCollection)

Configura qualsiasi elemento di associazione affinché supporti il comportamento del contratto.

ApplyClientBehavior(ContractDescription, ServiceEndpoint, ClientRuntime)

Implementa una modifica o un'estensione del client all'interno di un contratto.

ApplyDispatchBehavior(ContractDescription, ServiceEndpoint, DispatchRuntime)

Implementa una modifica o un'estensione del client all'interno di un contratto.

Validate(ContractDescription, ServiceEndpoint)

Procedere all'implementazione per verificare che il contratto e l'endpoint siano in grado di supportare il comportamento del contratto.

Si applica a