Condividi tramite


Specifica del comportamento del servizio Run-Time

Dopo aver progettato un contratto di servizio (progettazione di contratti di servizio) e implementato il contratto di servizio (implementazione dei contratti di servizio) è possibile configurare il comportamento dell'operazione del runtime del servizio. Questo argomento illustra i comportamenti del servizio e delle operazioni forniti dal sistema e descrive dove trovare altre informazioni per creare nuovi comportamenti. Mentre alcuni comportamenti vengono applicati come attributi, molti vengono applicati usando un file di configurazione dell'applicazione o a livello di codice. Per altre informazioni sulla configurazione dell'applicazione di servizio, vedere Configurazione dei servizi.

Informazioni generali

Il contratto definisce gli input, gli output, i tipi di dati e le funzionalità di un servizio di tale tipo. L'implementazione di un contratto di servizio crea una classe che, quando configurata con un binding a un indirizzo, soddisfa il contratto che implementa. Le informazioni contrattuali, vincolanti e di indirizzo sono tutte note dal cliente; senza di essi, il client non può usare il servizio.

Tuttavia, le specifiche dell'operazione, ad esempio i problemi di threading o la gestione delle istanze, sono opache per i client. Dopo aver implementato il contratto di servizio, è possibile configurare un numero elevato di caratteristiche operative usando i comportamenti. I comportamenti sono oggetti che modificano il runtime di Windows Communication Foundation (WCF) impostando una proprietà di 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 System.ServiceModel.ServiceBehaviorAttribute attributi e System.ServiceModel.OperationBehaviorAttribute sono i comportamenti più utili ed espongono le funzionalità operative più richieste. Poiché sono attributi, è possibile applicarli all'implementazione del servizio o dell'operazione. Altri comportamenti, ad esempio System.ServiceModel.Description.ServiceMetadataBehavior o System.ServiceModel.Description.ServiceDebugBehavior, vengono in genere applicati usando un file di configurazione dell'applicazione, anche se è possibile usarli a livello di codice.

Questo argomento fornisce una panoramica degli ServiceBehaviorAttribute attributi e OperationBehaviorAttribute , descrive i vari ambiti in cui i comportamenti possono funzionare e fornisce una descrizione rapida di molti dei comportamenti forniti dal sistema nei vari ambiti che possono essere di interesse per gli sviluppatori WCF.

ServiceBehaviorAttribute e OperationBehaviorAttribute

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

  • Durate dell'istanza

  • Supporto della concorrenza e della sincronizzazione

  • Comportamento della configurazione

  • Comportamento delle transazioni

  • Comportamento della serializzazione

  • Trasformazione dei metadati

  • Durata della sessione

  • Filtraggio degli indirizzi e elaborazione delle intestazioni

  • Impersonificazione

  • Per usare questi attributi, contrassegnare l'implementazione del servizio o dell'operazione con l'attributo appropriato per tale ambito e impostare le proprietà. Nell'esempio di codice seguente viene illustrata un'implementazione dell'operazione che usa 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. Ad esempio, un'operazione che richiede una transazione dal client deve essere configurata per utilizzare un binding che supporta le transazioni trasferite.

Well-Known Servizi Singleton

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

Ad esempio, la ServiceBehaviorAttribute.InstanceContextMode proprietà controlla la frequenza InstanceContext con cui viene rilasciato e le OperationBehaviorAttribute.ReleaseInstanceMode proprietà e ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete controllano quando viene rilasciato l'oggetto servizio.

Tuttavia, è anche possibile creare manualmente un oggetto servizio e creare l'host del servizio usando tale oggetto. A tale scopo, è necessario impostare anche la ServiceBehaviorAttribute.InstanceContextMode proprietà su Single o viene generata un'eccezione quando l'host del servizio viene aperto.

Usare il ServiceHost(Object, Uri[]) costruttore per creare un servizio di questo tipo. Offre un'alternativa all'implementazione di un oggetto personalizzato System.ServiceModel.Dispatcher.IInstanceContextInitializer quando si vuole fornire un'istanza di oggetto specifica da usare da un servizio singleton. È possibile usare questo overload quando il tipo di implementazione del servizio è difficile da costruire, ad esempio se non implementa un costruttore pubblico senza parametri.

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

Altri comportamenti di Servizio, Endpoint, Contratto e Operazione

I comportamenti del servizio, ad esempio l'attributo ServiceBehaviorAttribute , operano in un intero servizio. Ad esempio, se si imposta la ServiceBehaviorAttribute.ConcurrencyMode proprietà su ConcurrencyMode.Multiple è necessario gestire i problemi di sincronizzazione dei thread all'interno di ogni operazione in tale servizio. I comportamenti degli endpoint operano in un endpoint; molti dei comportamenti degli endpoint forniti dal sistema sono destinati alle funzionalità client. I comportamenti contrattuali operano a livello di contratto e i comportamenti operativi modificano la consegna delle operazioni.

Molti di questi comportamenti vengono implementati sugli attributi e vengono utilizzati come gli attributi ServiceBehaviorAttribute e OperationBehaviorAttribute, applicandoli alla classe del servizio o all'implementazione dell'operazione appropriata. Altri comportamenti, ad esempio gli ServiceMetadataBehavior oggetti o ServiceDebugBehavior , vengono in genere applicati usando un file di configurazione dell'applicazione, anche se possono essere usati anche a livello di codice.

Ad esempio, la pubblicazione dei metadati viene configurata utilizzando l'oggetto ServiceMetadataBehavior . Il file di configurazione dell'applicazione seguente mostra 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>

Le sezioni seguenti descrivono molti dei comportamenti forniti dal sistema tra i più utili che è possibile usare per modificare la fornitura in tempo reale del servizio o del client. Vedere l'argomento di riferimento per determinare come usare ognuno di essi.

Comportamenti del servizio

I comportamenti seguenti operano sui servizi.

Comportamenti degli endpoint

I comportamenti seguenti operano sugli endpoint. Molti di questi comportamenti vengono usati nelle applicazioni client.

  • CallbackBehaviorAttribute. Configura un'implementazione del 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 usare nel client.

  • ClientViaBehavior. Usato 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 di MustUnderstand.

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

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

Comportamenti del contratto

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

Comportamenti dell'operazione

I comportamenti dell'operazione seguenti specificano la serializzazione e i controlli delle transazioni per le operazioni.

Vedere anche