Specifica del comportamento in fase di esecuzione del servizio

Dopo aver definito un contratto di servizio (Designing Service Contracts) e implementato tale contratto (Implementing Service Contracts), è possibile configurare il comportamento operativo del runtime del servizio. In questo argomento vengono illustrati i comportamenti dell'operazione e del servizio forniti dal sistema e viene descritto dove trovare ulteriori informazioni per creare nuovi comportamenti. Mentre alcuni comportamenti vengono applicati come attributi, molti vengono applicati utilizzando un file di configurazione dell'applicazione o a livello di codice. Per altre informazioni sulla configurazione dell'applicazione di servizio, vedere Configurazione dei servizi.

Panoramica

Il contratto definisce gli input, gli output, i tipi di dati e le funzionalità di un servizio di quel tipo. L'implementazione di un contratto di servizio crea una classe che, in caso di configurazione con un'associazione in un indirizzo, adempie al contratto che implementa. Il client conosce le informazioni contrattuali, sull'associazione e sull'indirizzo, senza le quali non potrebbe utilizzare il servizio.

Le specifiche dell'operazione, ad esempio i problemi di threading o la gestione delle istanze, sono tuttavia opache ai client. Dopo aver implementato il contratto di servizio, è possibile configurare numerose caratteristiche dell'operazione utilizzando i comportamenti. I comportamenti sono oggetti che modificano il runtime di WCF (Windows Communication Foundation) impostando una proprietà runtime o inserendo un tipo di personalizzazione nel runtime. Per altre informazioni sulla modifica del runtime creando comportamenti definiti dall'utente, vedere Estensione di ServiceHost e del livello del modello di servizio.

Gli attributi System.ServiceModel.ServiceBehaviorAttribute e System.ServiceModel.OperationBehaviorAttribute sono i comportamenti più utili ed espongono le funzionalità dell'operazione richieste più comunemente. Essendo degli attributi, vengono applicati all'implementazione del servizio o dell'operazione. Altri comportamenti, ad esempio System.ServiceModel.Description.ServiceMetadataBehavior o System.ServiceModel.Description.ServiceDebugBehavior, vengono in genere applicati utilizzando un file di configurazione dell'applicazione, anche se è possibile utilizzarli a livello di programmazione.

In questo argomento viene fornita una panoramica degli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute, vengono descritti i vari ambiti in cui possono operare i comportamenti e viene data una descrizione rapida di molti dei comportamenti forniti dal sistema nei vari ambiti che possono essere di interesse per gli sviluppatori di WCF.

ServiceBehaviorAttribute e OperationBehaviorAttribute

I comportamenti più importanti sono gli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute che è possibile utilizzare per controllare:

  • Durate delle istanze

  • Supporto di sincronizzazione e concorrenza

  • Comportamento di configurazione

  • Comportamento della transazione

  • Comportamento della serializzazione

  • Trasformazione dei metadati

  • Durata della sessione

  • Filtraggio dell'indirizzo ed elaborazione dell'intestazione

  • Rappresentazione

  • Per utilizzare questi attributi, contrassegnare l'implementazione del servizio o dell'operazione con l'attributo appropriato per quell'ambito e impostare le proprietà. Nell'esempio di codice seguente, ad esempio, viene illustrata un'implementazione dell'operazione che utilizza la proprietà OperationBehaviorAttribute.Impersonation per richiedere che i chiamanti di questa operazione supportino la rappresentazione.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name="SampleHello",
    Namespace="http://microsoft.wcf.documentation"
  )]
  public interface IHello
  {
    [OperationContract]
    string Hello(string greeting);
  }

  public class HelloService : IHello
  {

    public HelloService()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~HelloService()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string Hello(string greeting)
    {
      Console.WriteLine("Called by: " + Thread.CurrentPrincipal.Identity.Name);
      Console.WriteLine("IsAuthenticated: " + Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString());
      Console.WriteLine("AuthenticationType: " + Thread.CurrentPrincipal.Identity.AuthenticationType.ToString());

      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Sending back: Hi, " + Thread.CurrentPrincipal.Identity.Name);
      return "Hi, " + Thread.CurrentPrincipal.Identity.Name;
    }
  }
}
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
    Public Interface IHello
        <OperationContract> _
        Function Hello(ByVal greeting As String) As String
    End Interface

    Public Class HelloService
        Implements IHello

        Public Sub New()
            Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
        End Sub

        Protected Overrides Sub Finalize()
            Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
        End Sub

        <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
        Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
            Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
            Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
            Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())

            Console.WriteLine("Caller sent: " & greeting)
            Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
            Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
        End Function
    End Class
End Namespace

Molte delle proprietà richiedono supporto aggiuntivo dall'associazione. Un'operazione che richiede una transazione dal client, ad esempio, deve essere configurata in modo che utilizzi un'associazione che supporta transazioni propagate.

Servizi Singleton noti

È possibile utilizzare gli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute per controllare determinate durate, sia di InstanceContext che degli oggetti servizio che implementano le operazioni.

La proprietà ServiceBehaviorAttribute.InstanceContextMode , ad esempio, consente di controllare la frequenza di rilascio di InstanceContext , mentre le proprietà OperationBehaviorAttribute.ReleaseInstanceMode e ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete consentono di controllare quando l'oggetto servizio viene rilasciato.

È tuttavia possibile creare un oggetto servizio e quindi creare l'host del servizio tramite quell'oggetto. A tale scopo, è necessario impostare la proprietà ServiceBehaviorAttribute.InstanceContextMode su Single , in caso contrario verrà generata un'eccezione quando l'host del servizio viene aperto.

Utilizzare il costruttore ServiceHost(Object, Uri[]) per creare tale servizio. Fornisce un'alternativa all'implementazione di un'interfaccia System.ServiceModel.Dispatcher.IInstanceContextInitializer personalizzata quando si desidera fornire un'istanza specifica dell'oggetto utilizzabile da un servizio singleton. Questo overload può risultare utile quando il tipo di implementazione del servizio è di difficile costruzione, ad esempio se non implementa alcun costruttore pubblico privo di parametri.

Si noti che quando un oggetto viene fornito a questo costruttore, alcune funzionalità relative al comportamento di creazione delle istanze di Windows Communication Foundation (WCF) operano in modo diverso. La chiamata, ad esempio, di InstanceContext.ReleaseServiceInstance non ha effetto quando viene fornita l'istanza di un oggetto noto. Analogamente, qualsiasi altro meccanismo di rilascio delle istanze viene ignorato. La classe ServiceHost si comporta sempre come se la proprietà OperationBehaviorAttribute.ReleaseInstanceMode fosse impostata su ReleaseInstanceMode.None per tutte le operazioni.

Altri comportamenti del servizio, dell'endpoint, del contratto e dell'operazione

I comportamenti del servizio, ad esempio l'attributo ServiceBehaviorAttribute , agiscono su un servizio intero. Se, ad esempio, si imposta la proprietà ServiceBehaviorAttribute.ConcurrencyMode su ConcurrencyMode.Multiple , è necessario gestire i problemi di sincronizzazione dei thread all'interno di ogni operazione in quel servizio. I comportamenti dell'endpoint operano all'interno di un endpoint. Molti dei comportamenti dell'endpoint forniti dal sistema interessano la funzionalità client. I comportamenti del contratto operano a livello di contratto e i comportamenti dell'operazione modificano il recapito dell'operazione.

Molti di questi comportamenti vengono implementati sugli attributi e vengono utilizzati come si utilizzano gli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute , applicandoli alla classe di servizio appropriata o all'implementazione dell'operazione. Altri comportamenti, ad esempio gli oggetti ServiceMetadataBehavior o ServiceDebugBehavior , vengono in genere applicati utilizzando un file di configurazione dell'applicazione, sebbene sia possibile utilizzarli anche a livello di programmazione.

La pubblicazione di metadati, ad esempio, viene configurata utilizzando l'oggetto ServiceMetadataBehavior . Nel file seguente di configurazione dell'applicazione viene illustrato l'utilizzo più comune.

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService" />
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <!-- Adds a WS-MetadataExchange endpoint at -->
        <!-- "http://localhost:8080/SampleService/mex" -->
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <!-- Enables the IMetadataExchange endpoint in services that -->
        <!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
        <!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
        <!-- Service metadata for retrieval by HTTP/GET at the address -->
        <!-- "http://localhost:8080/SampleService?wsdl" -->
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  </system.serviceModel>
</configuration>

Nelle sezioni seguenti vengono descritti molti dei comportamenti più utili forniti dal sistema e che possono essere utilizzati per modificare il recapito runtime del servizio o del client. Per informazioni su come utilizzare ognuno di essi, vedere l'argomento di riferimento.

Comportamenti del servizio

I comportamenti seguenti operano sui servizi.

Comportamenti dell'endpoint

I comportamenti seguenti operano sugli endpoint. Molti di questi comportamenti sono utilizzati in applicazioni client.

  • CallbackBehaviorAttribute. Configura l'implementazione di un servizio di callback in un'applicazione client duplex.

  • CallbackDebugBehavior. Abilita il debug del servizio per un oggetto callback WCF.

  • ClientCredentials. Consente all'utente di configurare le credenziali client e del servizio, nonché le impostazioni di autenticazione delle credenziali del servizio da utilizzare nel client.

  • ClientViaBehavior. Utilizzato dai client per specificare l'URI (Uniform Resource Identifier) per il quale deve essere creato il canale di trasporto.

  • MustUnderstandBehavior. Indica a WCF di disabilitare l'elaborazione MustUnderstand.

  • SynchronousReceiveBehavior. Indica al runtime di utilizzare un processo di ricezione sincrono per i canali.

  • TransactedBatchingBehavior. Ottimizza le operazioni di ricezione per i trasporti che supportano ricezioni transazionali.

Comportamenti del contratto

DeliveryRequirementsAttribute. Specifica i requisiti della funzionalità che le associazioni devono fornire all'implementazione del servizio o del client.

Comportamenti dell'operazione

I comportamenti dell'operazione seguenti specificano i controlli di serializzazione e di transazione per le operazioni.

Vedi anche