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.
AspNetCompatibilityRequirementsAttribute. Applicato a un servizio WCF per indicare se tale servizio può essere eseguito in modalità di compatibilità ASP.NET.
ServiceAuthorizationBehavior. Controlla come il servizio autorizza le richieste del client.
ServiceCredentials. Configura una credenziale del servizio. Utilizzare questa classe per specificare la credenziale per il servizio, ad esempio un certificato X.509.
ServiceDebugBehavior. Abilita le funzionalità di debug e informazioni della Guida per un servizio WCF.
ServiceMetadataBehavior. Controlla la pubblicazione dei metadati del servizio e delle informazioni associate.
ServiceSecurityAuditBehavior. Specifica il comportamento di controllo degli eventi di sicurezza.
ServiceThrottlingBehavior. Configura le impostazioni di velocità runtime che consentono di ottimizzare le prestazioni del servizio.
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.
DataContractSerializerOperationBehavior. Rappresenta il comportamento runtime di System.Runtime.Serialization.DataContractSerializer.
XmlSerializerOperationBehavior. Controlla il comportamento runtime di
XmlSerializer
e lo associa a un'operazione.TransactionFlowAttribute. Specifica il livello al quale un'operazione del servizio accetta un'intestazione di transazione.