Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Interfaccia IServiceBehavior

 

Fornisce un meccanismo per modificare o inserire estensioni personalizzate all'interno di un servizio, inclusa la classe ServiceHostBase.

Spazio dei nomi:   System.ServiceModel.Description
Assembly:  System.ServiceModel (in System.ServiceModel.dll)

public interface IServiceBehavior

NomeDescrizione
System_CAPS_pubmethodAddBindingParameters(ServiceDescription, ServiceHostBase, Collection<ServiceEndpoint>, BindingParameterCollection)

Consente di passare i dati personalizzati agli elementi di associazione per supportare l'implementazione del contratto.

System_CAPS_pubmethodApplyDispatchBehavior(ServiceDescription, ServiceHostBase)

Consente di modificare i valori delle proprietà della fase di esecuzione o inserire oggetti di estensione personalizzati, ad esempio gestori di errori, intercettatori di messaggi o parametri, estensioni di sicurezza e altri oggetti di estensione personalizzati.

System_CAPS_pubmethodValidate(ServiceDescription, ServiceHostBase)

Consente di controllare l'host del servizio e la descrizione del servizio per verificare che il servizio può essere eseguito correttamente.

Implementare l'interfaccia IServiceBehavior per modificare, esaminare o estendere aspetti dell'esecuzione del servizio a livello di applicazione:

  • Utilizzare il metodo ApplyDispatchBehavior per modificare i valori delle proprietà della fase di esecuzione o inserire oggetti di estensione personalizzati, ad esempio gestori di errori, intercettatori di messaggi o parametri, estensioni di sicurezza e altri oggetti di estensione personalizzati.

  • Utilizzare il metodo Validate per esaminare la descrizione prima che Windows Communication Foundation (WCF) costruisca il servizio in esecuzione per verificarne la corretta esecuzione.

  • Utilizzare il metodo AddBindingParameters per passare le informazioni personalizzate per il servizio a un elemento dell'associazione, in modo che possa supportare il servizio correttamente.

Gli oggetti IServiceBehavior 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 un valore.

System_CAPS_noteNota

Tutti i metodi IServiceBehavior passano gli oggetti System.ServiceModel.Description.ServiceDescription e System.ServiceModel.ServiceHostBase come parametri. Il parametro ServiceDescription è utilizzabile solo per attività di esame. Se gli oggetti vengono modificati, il comportamento di esecuzione sarà indefinito.

Per eseguire un'attività di personalizzazione specificata, è necessario aggiungere l'oggetto IServiceBehavior alla proprietà Behaviors prima della costruzione della fase di esecuzione del servizio. A questo scopo, è possibile eseguire tre operazioni:

  • Aggiungere il comportamento del servizio personalizzato a livello di programmazione alla proprietà Behaviors prima che il metodo ICommunicationObject.Open venga chiamato sull'oggetto System.ServiceModel.ServiceHost.

  • Creare un attributo personalizzato che implementi IServiceBehavior e utilizzarlo per contrassegnare le classi del servizio da modificare. Quando un oggetto ServiceHost viene costruito, WCF utilizza la reflection per individuare gli attributi sul tipo di servizio. Se gli attributi implementano IServiceBehavior, vengono aggiunti alla raccolta di comportamenti su ServiceDescription.

  • Estendere la classe System.ServiceModel.Configuration.BehaviorExtensionElement per supportare la specifica del comportamento in un'applicazione o in un file di configurazione del computer. Per ulteriori informazioni, vedere la sezione relativa agli esempi.

Esempi di comportamenti del servizio in WCF includono l'attributo ServiceBehaviorAttribute e le proprietà System.ServiceModel.Description.ServiceThrottlingBehavior, System.ServiceModel.Description.ServiceDebugBehavior e System.ServiceModel.Description.ServiceMetadataBehavior.

Nell'esempio di codice seguente viene illustrato come utilizzare un comportamento del servizio specificato in un file di configurazione per inserire un gestore di errori personalizzato in un'applicazione del servizio. In questo esempio, il gestore di errori intercetta tutte le eccezioni e le converte in un errore SOAP GreetingFault personalizzato che verrà quindi restituito al client.

La seguente implementazione di IServiceBehavior non aggiunge alcun oggetto parametro di associazione, aggiunge invece l'oggetto personalizzato System.ServiceModel.Dispatcher.IErrorHandler a ogni proprietà ChannelDispatcher.ErrorHandlers, convalida ogni operazione del servizio al quale viene applicato il comportamento del servizio e dispone di System.ServiceModel.FaultContractAttribute di tipo GreetingFault.

// This behavior modifies no binding parameters.
#region IServiceBehavior Members
public void AddBindingParameters(
  ServiceDescription description, 
  ServiceHostBase serviceHostBase, 
  System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, 
  System.ServiceModel.Channels.BindingParameterCollection parameters
)
{
  return;
}

// This behavior is an IErrorHandler implementation and 
// must be applied to each ChannelDispatcher.
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
  Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.");
  foreach(ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
  {
    chanDisp.ErrorHandlers.Add(this);      
  }
}

// This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
  Console.WriteLine("Validate is called.");
  foreach (ServiceEndpoint se in description.Endpoints)
  {
    // Must not examine any metadata endpoint.
    if (se.Contract.Name.Equals("IMetadataExchange")
      && se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex"))
      continue;
    foreach (OperationDescription opDesc in se.Contract.Operations)
    {
      if (opDesc.Faults.Count == 0)
        throw new InvalidOperationException(String.Format(
          "EnforceGreetingFaultBehavior requires a "  
          + "FaultContractAttribute(typeof(GreetingFault)) in each operation contract.  "
          + "The \"{0}\" operation contains no FaultContractAttribute.",
          opDesc.Name)
        );
      bool gfExists = false;
      foreach (FaultDescription fault in opDesc.Faults)
      {
        if (fault.DetailType.Equals(typeof(GreetingFault)))
        {
          gfExists = true;
          continue;
        }
      }
      if (gfExists == false)
      {
        throw new InvalidOperationException(
"EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract."
        );
      }
    }
  }
}
#endregion

In questo esempio, la classe di comportamento implementa anche System.ServiceModel.Configuration.BehaviorExtensionElement che consente al comportamento del servizio di essere inserito utilizzandolo in un file di configurazione dell'applicazione, come dimostra l'esempio di codice seguente.

.NET Framework
Disponibile da 3.0
Torna all'inizio
Mostra: