Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Nelle applicazioni Windows Communication Foundation (WCF) una sessione correla un gruppo di messaggi in una conversazione. Le sessioni WCF sono diverse dall'oggetto sessione disponibile nelle applicazioni ASP.NET, supportano comportamenti diversi e sono controllate in modi diversi. In questo argomento vengono descritte le funzionalità abilitate dalle sessioni nelle applicazioni WCF e come usarle.
Sessioni nelle applicazioni Windows Communication Foundation
Quando un contratto di servizio specifica che richiede una sessione, tale contratto specifica che tutte le chiamate ,ovvero gli scambi di messaggi sottostanti che supportano le chiamate, devono far parte della stessa conversazione. Se un contratto specifica che consente sessioni ma non ne richiede uno, i client possono connettersi e stabilire una sessione o non stabilire una sessione. Se la sessione termina e viene inviato un messaggio tramite lo stesso canale viene generata un'eccezione.
Le sessioni WCF hanno le funzionalità concettuali principali seguenti:
Vengono avviate e terminate in modo esplicito dall'applicazione chiamante (il client WCF).
I messaggi recapitati durante una sessione vengono elaborati nell'ordine in cui vengono ricevuti.
Le sessioni correlano un gruppo di messaggi in una conversazione. Sono possibili tipi diversi di correlazione. Ad esempio, un canale basato su sessione può correlare i messaggi in base a una connessione di rete condivisa, mentre un altro canale basato su sessione può correlare i messaggi in base a un tag condiviso nel corpo del messaggio. Le funzionalità che possono essere derivate dalla sessione dipendono dalla natura della correlazione.
Nessun archivio dati generale associato a una sessione WCF.
Se si ha familiarità con la System.Web.SessionState.HttpSessionState classe nelle applicazioni ASP.NET e con le funzionalità fornite, è possibile notare le differenze seguenti tra quel tipo di sessione e le sessioni WCF:
ASP.NET sessioni vengono sempre avviate dal server.
Le sessioni di ASP.NET sono implicitamente non ordinate.
ASP.NET sessioni forniscono un meccanismo generale di archiviazione dei dati tra le richieste.
Questo argomento descrive:
Comportamento di esecuzione predefinito quando si usano associazioni basate su sessione nel livello del modello di servizio.
Tipi di funzionalità fornite dalle associazioni basate sulla sessione WCF fornite dal sistema.
Come creare un contratto che dichiara un requisito di sessione.
Come comprendere e controllare la creazione e la chiusura della sessione e la relazione della sessione con l'istanza del servizio.
Comportamento di esecuzione predefinito tramite sessioni
Un'associazione che tenta di avviare una sessione è denominata associazione basata su sessione. I contratti di servizio specificano che richiedono, consentono o rifiutano associazioni basate su sessione impostando la ServiceContractAttribute.SessionMode proprietà sull'interfaccia del contratto di servizio (o classe) su uno dei System.ServiceModel.SessionMode valori di enumerazione. Per impostazione predefinita, il valore di questa proprietà è Allowed, ovvero se un client usa un'associazione basata su sessione con un'implementazione del servizio WCF, il servizio stabilisce e usa la sessione fornita.
Quando un servizio WCF accetta una sessione client, le funzionalità seguenti sono abilitate per impostazione predefinita:
Tutte le chiamate tra un oggetto client WCF vengono gestite dalla stessa istanza del servizio.
Diverse associazioni basate su sessione offrono funzionalità aggiuntive.
Tipi di sessione System-Provided
Un'associazione basata su sessione supporta l'associazione predefinita di un'istanza del servizio a una determinata sessione. Tuttavia, diverse associazioni basate su sessione supportano funzionalità diverse oltre ad abilitare il controllo di istanze basato su sessione descritto in precedenza.
WCF offre i tipi seguenti di comportamento dell'applicazione basata su sessione:
System.ServiceModel.Channels.SecurityBindingElement supporta sessioni basate sulla sicurezza, in cui entrambe le estremità della comunicazione hanno concordato una conversazione sicura e specifica. Per altre informazioni, vedere Protezione dei servizi. Ad esempio, l'associazione System.ServiceModel.WSHttpBinding , che contiene il supporto per sessioni di sicurezza e sessioni affidabili, per impostazione predefinita usa solo una sessione sicura che crittografa e firma digitalmente i messaggi.
L'associazione System.ServiceModel.NetTcpBinding supporta sessioni basate su TCP/IP per garantire che tutti i messaggi siano correlati dalla connessione a livello di socket.
L'elemento System.ServiceModel.Channels.ReliableSessionBindingElement , che implementa la specifica di WS-ReliableMessaging, fornisce il supporto per sessioni affidabili in cui i messaggi possono essere configurati in modo da essere recapitati in ordine e esattamente una volta, assicurando che i messaggi vengano ricevuti anche quando i messaggi si spostano tra più nodi durante la conversazione. Per altre informazioni, vedere Sessioni affidabili.
L'associazione System.ServiceModel.NetMsmqBinding fornisce sessioni di datagrammi MSMQ. Per altre informazioni, vedere Code in WCF.
L'impostazione della SessionMode proprietà non specifica il tipo di sessione richiesto dal contratto, ma ne richiede solo uno.
Creazione di un contratto che richiede una sessione
La creazione di un contratto che richiede una sessione indica che il gruppo di operazioni dichiarate dal contratto di servizio deve essere eseguito tutti all'interno della stessa sessione e che i messaggi devono essere recapitati in ordine. Per asserire il livello di supporto della sessione richiesto da un contratto di servizio, impostare la proprietà sull'interfaccia ServiceContractAttribute.SessionMode del contratto di servizio o sulla classe sul valore dell'enumerazione System.ServiceModel.SessionMode per specificare se il contratto:
Richiede una sessione.
Consente a un client di stabilire una sessione.
Impedisce una sessione.
L'impostazione della SessionMode proprietà non consente tuttavia di specificare il tipo di comportamento basato sulla sessione richiesto dal contratto. Indica a WCF di confermare in fase di esecuzione che l'associazione configurata (che crea il canale di comunicazione) per il servizio possa stabilire, non stabilisca, o possa stabilire una sessione durante l'implementazione di un servizio. Anche in questo caso, l'associazione può soddisfare tale requisito con qualsiasi tipo di comportamento basato su sessione scelto, come ad esempio sicurezza, trasporto, affidabilità o una combinazione di esse. Il comportamento esatto dipende dal System.ServiceModel.SessionMode valore selezionato. Se l'associazione configurata del servizio non è conforme al valore di SessionMode, viene generata un'eccezione. I binding e i canali creati per le sessioni di supporto sono considerati basati sulla sessione.
Il contratto di servizio seguente specifica che tutte le operazioni in ICalculatorSession devono essere scambiate all'interno di una sessione. Nessuna delle operazioni restituisce un valore al chiamante, ad eccezione del Equals metodo . Tuttavia, il Equals metodo non accetta parametri e pertanto può restituire solo un valore diverso da zero all'interno di una sessione in cui i dati sono già stati passati alle altre operazioni. Questo contratto richiede che una sessione funzioni correttamente. Senza una sessione associata a un client specifico, l'istanza del servizio non ha modo di conoscere i dati precedenti inviati dal client.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
[OperationContract]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface
Se un servizio consente una sessione, viene stabilita una sessione e usata se il client ne avvia uno; in caso contrario, non viene stabilita alcuna sessione.
Sessioni e istanze del servizio
Se si usa il comportamento predefinito di creazione di istanze in WCF, tutte le chiamate tra un oggetto client WCF vengono gestite dalla stessa istanza del servizio. Pertanto, a livello di applicazione, è possibile pensare a una sessione come abilitare il comportamento dell'applicazione simile al comportamento delle chiamate locali. Ad esempio, quando si crea un oggetto locale:
Viene chiamato un costruttore.
Tutte le chiamate successive effettuate al riferimento all'oggetto client WCF vengono elaborate dalla stessa istanza dell'oggetto.
Un distruttore viene chiamato quando il riferimento all'oggetto viene eliminato definitivamente.
Le sessioni consentono un comportamento simile tra client e servizi purché venga usato il comportamento predefinito dell'istanza del servizio. Se un contratto di servizio richiede o supporta sessioni, una o più operazioni del contratto possono essere contrassegnate come inizializzazione o terminazione di una sessione impostando le IsInitiating proprietà e IsTerminating .
Le operazioni di avvio sono quelle che devono essere chiamate come prima operazione di una nuova sessione. Le operazioni non di avvio possono essere chiamate solo dopo che è stata chiamata almeno un'operazione di avvio. È quindi possibile creare un tipo di costruttore di sessione per il servizio dichiarando le operazioni di avvio progettate per accettare l'input dai client appropriati all'inizio dell'istanza del servizio. Lo stato è associato alla sessione, ma non all'oggetto servizio.
Le operazioni di terminazione, viceversa, sono quelle che devono essere chiamate come ultimo messaggio in una sessione esistente. Nel caso predefinito, WCF ricicla l'oggetto servizio e il relativo contesto dopo la sessione con cui è stato associato il servizio viene chiuso. È quindi possibile creare un tipo di distruttore dichiarando le operazioni di terminazione progettate per eseguire una funzione appropriata alla fine dell'istanza del servizio.
Annotazioni
Anche se il comportamento predefinito presenta una somiglianza con costruttori e distruttori locali, è solo una somiglianza. Qualsiasi operazione del servizio WCF può essere un'operazione di avvio o di terminazione o entrambe contemporaneamente. Inoltre, nel caso predefinito, l'avvio delle operazioni può essere chiamato qualsiasi numero di volte in qualsiasi ordine; non vengono create sessioni aggiuntive dopo che la sessione viene stabilita e associata a un'istanza, a meno che non si controlli in modo esplicito la durata dell'istanza del servizio (modificando l'oggetto System.ServiceModel.InstanceContext ). Infine, lo stato è associato alla sessione e non all'oggetto servizio.
Ad esempio, il ICalculatorSession contratto usato nell'esempio precedente richiede che l'oggetto client WCF chiami l'operazione Clear prima di qualsiasi altra operazione e che la sessione con questo oggetto client WCF termini quando chiama l'operazione Equals. Nell'esempio di codice seguente viene illustrato un contratto che applica questi requisiti.
Clear deve essere chiamato prima per avviare una sessione e tale sessione termina quando Equals viene chiamato.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
Sub Clear()
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub DivideBy(ByVal n As Double)
<OperationContract(IsInitiating:=False, IsTerminating:=True)> _
Function Equal() As Double
End Interface
I servizi non avviano sessioni con i client. Nelle applicazioni client WCF esiste una relazione diretta tra la durata del canale basato sulla sessione e la durata della sessione stessa. Di conseguenza, i client creano nuove sessioni creando nuovi canali basati su sessione ed eliminano le sessioni esistenti chiudendo in modo appropriato i canali basati su sessione. Un client avvia una sessione con un endpoint di servizio chiamando uno dei seguenti:
ICommunicationObject.Open nel canale restituito da una chiamata a ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Open nell'oggetto client WCF generato dallo strumento di utilità dei metadati di ServiceModel (Svcutil.exe).
Un'operazione di avvio su un tipo di oggetto client WCF (per impostazione predefinita, tutte le operazioni vengono avviate). Quando viene chiamata la prima operazione, l'oggetto client WCF apre automaticamente il canale e avvia una sessione.
In genere un client termina una sessione con un endpoint di servizio chiamando uno dei seguenti:
ICommunicationObject.Close nel canale restituito da una chiamata a ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Close nell'oggetto client WCF generato da Svcutil.exe.
Operazione di terminazione su un tipo di oggetto client WCF (per impostazione predefinita, nessuna operazione termina; il contratto deve specificare in modo esplicito un'operazione di terminazione). Quando viene chiamata la prima operazione, l'oggetto client WCF apre automaticamente il canale e avvia una sessione.
Per esempi, vedere Procedura: Creare un servizio che richiede sessioni , nonché gli esempi di comportamento del servizio predefinito e istanze .
Per altre informazioni su client e sessioni, vedere Accesso ai servizi tramite un client WCF.
Sessioni interagiscono con le impostazioni InstanceContext
Esiste un'interazione tra l'enumerazione SessionMode in un contratto e la ServiceBehaviorAttribute.InstanceContextMode proprietà , che controlla l'associazione tra canali e oggetti servizio specifici. Per altre informazioni, vedere Sessioni, istanze e concorrenza.
Condivisione di oggetti InstanceContext
È anche possibile controllare il canale o la chiamata basata su sessione a cui è associato l'oggetto InstanceContext eseguendo l'associazione manualmente.
Sessioni e streaming
Quando si dispone di una grande quantità di dati da trasferire, la modalità di trasferimento del flusso in WCF è un'alternativa fattibile al comportamento predefinito del buffering e dell'elaborazione dei messaggi in memoria nella loro interezza. È possibile che si verifichi un comportamento imprevisto durante le chiamate di streaming con un'associazione basata su sessione. Tutte le chiamate di streaming vengono effettuate tramite un singolo canale (il canale del datagramma) che non supporta le sessioni anche se l'associazione utilizzata è configurata per l'uso delle sessioni. Se più client effettuano chiamate di streaming allo stesso oggetto servizio tramite un'associazione basata su sessione e la modalità di concorrenza dell'oggetto servizio è impostata su single e la modalità di contesto dell'istanza è impostata su PerSession, tutte le chiamate devono passare attraverso il canale del datagram e quindi viene elaborata una sola chiamata alla volta. Uno o più client potrebbero quindi scadere. È possibile risolvere questo problema impostando l'oggetto servizio InstanceContextMode su PerCall o impostando l'opzione Concorrenza su multiplo.
Annotazioni
MaxConcurrentSessions non ha alcun effetto in questo caso perché è disponibile una sola "sessione".