Utilisation de sessions

Dans les applications WCF (Windows Communication Foundation), une session met en corrélation un groupe de messages dans une conversation. Les sessions WCF sont différentes de l’objet session disponible dans des applications ASP.NET, elles prennent en charge différents comportements et sont contrôlées de différentes façons. Cette rubrique décrit les fonctionnalités activées par les sessions dans les applications WCF, et comment les utiliser.

Sessions dans les applications Windows Communication Foundation

Lorsqu'un contrat de service spécifie qu'il requiert une session, ce contrat requiert que les appels généraux (autrement dit, les échanges de messages sous-jacents qui prennent en charge les appels) doivent faire partie de la même conversation. Si un contrat spécifie qu'il autorise des sessions mais n'en requiert pas, les clients peuvent se connecter et établir ou non une session. Si la session se termine et qu'un message est envoyé via le même canal, une exception est levée.

Les sessions WCF sont associées aux principales fonctionnalités conceptuelles suivantes :

  • Elles sont explicitement initialisées et terminées par l'application appelante (le client WCF).

  • Les messages remis pendant une session sont traités dans l'ordre dans lequel ils sont reçus.

  • Les sessions corrèlent un groupe de messages dans une conversation. Différents types de corrélation sont possibles : Par exemple, un canal basé sur session peut corréler des messages sur la base d'une connexion réseau partagée, pendant qu'un autre canal basé sur session corrèle des messages sur la base d'une balise partagée dans le corps du message. Les fonctionnalités qui peuvent être dérivées de la session varient en fonction de la nature de la corrélation.

  • Il n’existe pas de magasin de données général associé à une session WCF.

Si vous connaissez la classe System.Web.SessionState.HttpSessionState des applications ASP.NET et les fonctionnalités qu’elle fournit, vous remarquerez les différences suivantes entre ce type de session et les sessions WCF :

  • Les sessions ASP.NET sont toujours lancées par le serveur.

  • Les sessions ASP.NET sont implicitement non ordonnées.

  • Les sessions ASP.NET fournissent un mécanisme de stockage général des données parmi l’ensemble des requêtes

Cette rubrique décrit :

  • Le comportement d'exécution par défaut lors de l'utilisation de liaisons basées sur session dans la couche de modèle de service.

  • Les types de fonctionnalités fournis par les liaisons WCF définies par le système et basées sur les sessions.

  • Comment créer un contrat qui déclare une spécification de session.

  • Comment comprendre et contrôler la création de la session , la fin de la session et la relation entre la session et l'instance de service.

Comportement d'exécution par défaut à l'aide de sessions

Une liaison qui tente d'initialiser une session est appelée une liaison basée sur session . Les contrats de service spécifient qu'ils requièrent, autorisent ou refusent des liaisons basées sur session en affectant l'une des valeurs d'énumération ServiceContractAttribute.SessionMode à la propriété System.ServiceModel.SessionMode sur l'interface de contrat de service (ou classe). Par défaut, la valeur de cette propriété est Allowed, signifiant que si un client utilise une liaison basée sur session avec une implémentation du service WCF, le service établit et utilise la session fournie.

Lorsqu’un service WCF accepte une session cliente, les fonctionnalités suivantes sont activées par défaut :

  1. Tous les appels entre un objet client WCF sont gérés par la même instance de service.

  2. Différentes liaisons basées sur les sessions fournissent des fonctionnalités supplémentaires.

Types de sessions fournis par le système

Une liaison basée sur session prend en charge l'association par défaut d'une instance de service avec une session donnée. Toutefois, différentes liaisons basées sur session prennent en charge des fonctionnalités différentes en plus d'activer le contrôle d'instanciation basé sur session précédemment décrit.

WCF fournit les types de comportement d’application basé sur session suivants :

La définition de la propriété SessionMode ne spécifie pas le type de session que le contrat requiert mais uniquement qu'il requiert un type de session.

Création d'un contrat qui requiert une session

La création d'un contrat qui requiert une session déclare que le groupe d'opérations que le contrat de service déclare doit entièrement être exécuté dans la même session et que les messages doivent être remis dans l'ordre. Pour déterminer le niveau de support de session qu'un contrat de service requiert, attribuez la valeur de l'énumération ServiceContractAttribute.SessionMode à la propriété System.ServiceModel.SessionMode sur votre interface de contrat de service ou classe, afin de spécifier si le contrat :

  • Requiert une session.

  • Permet à un client d'établir une session.

  • Interdit une session.

Toutefois, la définition de la propriété SessionMode ne spécifie pas le type de comportement basé sur session que le contrat requiert. Il demande à WCF de confirmer au moment de l’exécution que la liaison configurée (créant le canal de communication) pour le service établit, n’établit pas ou peut établir une session lors de l’implémentation d’un service. Une fois encore, la liaison peut satisfaire cette spécification avec tout type de comportement basé sur session choisi : sécurité, transport, fiable ou toute combinaison. Le comportement exact dépend de la valeur System.ServiceModel.SessionMode sélectionnée. Si la liaison configurée du service n'est pas conforme à la valeur SessionMode, une exception est levée. Les liaisons et les canaux créés prenant en charge ces sessions sont dits « basés sur session ».

Le contrat de service suivant spécifie que toutes les opérations de la ICalculatorSession doivent être échangées dans une session. Aucune des opérations ne retourne une valeur à l'appelant sauf la méthode Equals . Toutefois, la méthode Equals ne prend pas de paramètres et, par conséquent, peut retourner uniquement une valeur non nulle à l'intérieur d'une session dans laquelle les données sont déjà passées aux autres opérations. Ce contrat requiert qu'une session fonctionne correctement. Sans une session associée à un client spécifique, l'instance de service n'a aucun moyen de savoir quelles données ce client a envoyées précédemment.

[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

Si un service autorise une session, une session est établie et utilisée si le client en initialise une ; sinon, aucune session n'est établie.

Sessions et instances de service

Si vous utilisez le comportement d’instanciation par défaut de WCF, les appels généraux entre un objet client WCF sont gérés par la même instance de service. Par conséquent, au niveau de l'application, vous pouvez considérer une session comme un moyen d'activer un comportement d'application similaire au comportement d'appel local. Par exemple, lorsque vous créez un objet local :

  • Un constructeur est appelé.

  • Tous les appels effectués ultérieurement à la référence d’objet client WCF sont traités par la même instance d’objet.

  • Un destructeur est appelé lorsque la référence d'objet est détruite.

Les sessions activent un comportement semblable entre les clients et les services tant que le comportement de l'instance de service par défaut est utilisé. Si un contrat de service requiert ou prend en charge des sessions, une ou plusieurs opérations de contrat peuvent être marquées comme initialisant ou terminant une session, par l'attribution des propriétés IsInitiating et IsTerminating .

Lesopérations d'initialisation sont celles qui doivent être appelées comme première opération d'une nouvelle session. Vous devez appeler au moins une opération d'initialisation avant de pouvoir appeler d'autres opérations. Vous pouvez par conséquent créer un type de constructeur de session pour votre service en déclarant des opérations d'initialisation conçues pour prendre l'entrée des clients appropriés au début de l'instance de service. (Toutefois, l'état est associé à la session et pas à l'objet de service.)

Lesopérations de fin, inversement, doivent être appelées comme dernier message dans une session existante. Par défaut, WCF recycle l'objet du service et son contexte après la fermeture de la session à laquelle le service a été associé. Vous pouvez, par conséquent, créer un type de destructeur en déclarant les opérations de fin conçues pour exécuter une fonction appropriée à la fin de l'instance de service.

Notes

Bien que le comportement par défaut présente une ressemblance avec les constructeurs et les destructeurs locaux, il ne s'agit que d'une ressemblance. Toute opération du service WCF peut être une opération de lancement ou de fin, ou les deux à la fois. De plus, par défaut, les opérations d'initialisation peuvent être appelées un nombre illimité de fois, dans tout ordre, après l'appel de la première ; aucune session supplémentaire n'est créée une fois que la session est établie et associée à une instance, à moins que vous ne contrôliez explicitement la durée de vie de l'instance de service (en manipulant l'objet System.ServiceModel.InstanceContext ). Enfin, l'état est associé à la session et pas l'objet de service.

Par exemple, le contrat ICalculatorSession utilisé dans l’exemple précédent requiert que l’objet client WCF appelle en premier l’opération Clear avant toute autre opération, et que la session avec l’objet client WCF se termine lorsqu’il appelle l’opération Equals. L'exemple de code suivant montre un contrat qui applique ces spécifications. Clear doit être appelé en premier pour initialiser une session, et cette session se termine lorsque Equals est appelé.

[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

Les services ne démarrent pas de sessions avec les clients. Dans les applications clientes WCF, il existe une relation directe entre la durée de vie du canal basé sur session et la durée de vie de la session elle-même. En tant que tels, les clients créent de nouvelles sessions en créant de nouveaux canaux basés sur des sessions et détruisent les sessions existantes en fermant correctement lesdits canaux. Un client démarre une session avec un point de terminaison de service en appelant l'un des éléments suivants :

Habituellement, un client termine une session avec un point de terminaison de service en appelant l'un des éléments suivants :

  • ICommunicationObject.Close sur le canal retourné par un appel à ChannelFactory<TChannel>.CreateChannel.

  • ClientBase<TChannel>.Close sur l’objet client WCF généré par Svcutil.exe.

  • Une opération de fin sur l’un ou l’autre type d’objet client WCF (par défaut, aucune opération n’est une opération de fin ; le contrat doit spécifier explicitement une opération de fin). Lorsque la première opération est appelée, l’objet client WCF ouvre automatiquement le canal et lance une session.

Pour obtenir des exemples, consultez How to: Create a Service That Requires Sessions ainsi que Default Service Behavior et Instancing .

Pour plus d’informations sur les clients et les sessions, consultez Accès aux services à l’aide d’un client WCF.

Sessions interagissant avec les paramètres InstanceContext

Il y a une interaction entre l'énumération SessionMode dans un contrat et la propriété ServiceBehaviorAttribute.InstanceContextMode qui contrôle l'association entre canaux et objets de service spécifiques. Pour plus d’informations, consultez Sessions, instanciation et accès concurrentiel.

Partage d'objets InstanceContext

Vous pouvez également contrôler quel canal ou appel basé sur session est associé à tel ou tel objet InstanceContext en effectuant vous-même l'association.

Sessions et diffusion en continu

Lorsque vous avez une grande quantité de données à transférer, le mode de transfert par diffusion en continu dans WCF est une alternative possible au comportement par défaut de mise en mémoire tampon et de traitement des messages en mémoire dans leur intégralité. Vous pouvez obtenir un comportement inattendu lors de la diffusion en continu des appels avec une liaison basée sur session. Tous les appels en streaming passent par un canal unique (le canal de datagramme) qui ne prend pas en charge les sessions même si la liaison utilisée est configurée pour utiliser des sessions. Si plusieurs clients effectuent des appels de diffusion en continu vers le même objet de service sur une liaison basée sur session, et si le mode d'accès concurrentiel de l'objet de service est configuré comme unique et son mode de contexte d'instance a la valeur PerSession, les appels généraux doivent traverser le canal de datagramme et un seul appel à la fois est traité. Un ou plusieurs clients peuvent alors expirer. Vous pouvez contourner ce problème en attribuant au InstanceContextMode de l’objet de service la valeur PerCall, ou au mode d’accès concurrentiel la valeur Multiple.

Notes

MaxConcurrentSessions n'a aucun effet dans ce cas car une seule « session » est disponible.

Voir aussi