Utilisation de sessionsUsing Sessions

Dans les applications de la Windows Communication Foundation (WCF), une session met en corrélation un groupe de messages dans une conversation.In Windows Communication Foundation (WCF) applications, a session correlates a group of messages into a conversation. Les sessions WCF sont différentes de l’objet de session disponible dans ASP.NET applications, prennent en charge différents comportements et sont contrôlées de différentes manières.WCF sessions are different than the session object available in ASP.NET applications, support different behaviors, and are controlled in different ways. Ce sujet décrit les caractéristiques que les sessions permettent dans les applications WCF et comment les utiliser.This topic describes the features that sessions enable in WCF applications and how to use them.

Sessions dans les applications Windows Communication FoundationSessions in Windows Communication Foundation Applications

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.When a service contract specifies that it requires a session, that contract is specifying that all calls (that is, the underlying message exchanges that support the calls) must be part of the same 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.If a contract specifies that it allows sessions but does not require one, clients can connect and either establish a session or not establish a session. Si la session se termine et qu'un message est envoyé via le même canal, une exception est levée.If the session ends and a message is sent through the same channel an exception is thrown.

Les sessions WCF ont les principales caractéristiques conceptuelles suivantes :WCF sessions have the following main conceptual features:

  • Elles sont explicitement initialisées et terminées par l'application appelante (le client WCF).They are explicitly initiated and terminated by the calling application (the WCF client).

  • Les messages remis pendant une session sont traités dans l'ordre dans lequel ils sont reçus.Messages delivered during a session are processed in the order in which they are received.

  • Les sessions corrèlent un groupe de messages dans une conversation.Sessions correlate a group of messages into a conversation. Différents types de corrélation sont possibles :Different types of correlation are possible. 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.For instance, one session-based channel may correlate messages based on a shared network connection while another session-based channel may correlate messages based on a shared tag in the message body. Les fonctionnalités qui peuvent être dérivées de la session varient en fonction de la nature de la corrélation.The features that can be derived from the session depend on the nature of the correlation.

  • Il n’y a pas de magasin de données générale associé à une session WCF.There is no general data store associated with a WCF session.

Si vous connaissez System.Web.SessionState.HttpSessionState la classe dans ASP.NET applications et la fonctionnalité qu’il fournit, vous remarquerez peut-être les différences suivantes entre ce type de session et les sessions WCF :If you are familiar with the System.Web.SessionState.HttpSessionState class in ASP.NET applications and the functionality it provides, you might notice the following differences between that kind of session and WCF sessions:

  • ASP.NET sessions sont toujours initiées par le serveur.ASP.NET sessions are always server-initiated.

  • ASP.NET sessions sont implicitement désorganisées.ASP.NET sessions are implicitly unordered.

  • ASP.NET sessions fournissent un mécanisme général de stockage des données entre les demandes.ASP.NET sessions provide a general data storage mechanism across requests.

Cette rubrique décrit :This topic describes:

  • 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.The default execution behavior when using session-based bindings in the service model layer.

  • Les types de fonctionnalités que les fixations fournies par la session WCF fournissent.The types of features that the WCF session-based, system-provided bindings provide.

  • Comment créer un contrat qui déclare une spécification de session.How to create a contract that declares a session requirement.

  • 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.How to understand and control the creation and termination of the session and the relationship of the session to the service instance.

Comportement d'exécution par défaut à l'aide de sessionsDefault Execution Behavior Using Sessions

Une liaison qui tente d'initialiser une session est appelée une liaison basée sur session .A binding that attempts to initiate a session is called a session-based binding. 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).Service contracts specify that they require, permit, or refuse session-based bindings by setting the ServiceContractAttribute.SessionMode property on the service contract interface (or class) to one of the System.ServiceModel.SessionMode enumeration values. Par défaut, la valeur Allowedde cette propriété est , ce qui signifie que si un client utilise une liaison basée sur la session avec une mise en œuvre de service WCF, le service établit et utilise la session fournie.By default, the value of this property is Allowed, which means that if a client uses a session-based binding with a WCF service implementation, the service establishes and uses the session provided.

Lorsqu’un service WCF accepte une session client, les fonctionnalités suivantes sont activées par défaut :When a WCF service accepts a client session, the following features are enabled by default:

  1. Tous les appels entre un objet client WCF sont traités par la même instance de service.All calls between a WCF client object are handled by the same service instance.

  2. Différentes liaisons basées sur les sessions fournissent des fonctionnalités supplémentaires.Different session-based bindings provide additional features.

Types de sessions fournis par le systèmeSystem-Provided Session Types

Une liaison basée sur session prend en charge l'association par défaut d'une instance de service avec une session donnée.A session-based binding supports the default association of a service instance with a particular session. 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.However, different session-based bindings support different features in addition to enabling the session-based instancing control previously described.

WCF fournit les types suivants de comportement d’application basé sur la session :WCF provides the following types of session-based application behavior:

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.Setting the SessionMode property does not specify the type of session the contract requires, only that it requires one.

Création d'un contrat qui requiert une sessionCreating a Contract That Requires a 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.Creating a contract that requires a session states that the group of operations that the service contract declares must all be executed within the same session and that messages must be delivered in order. 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 :To assert the level of session support that a service contract requires, set the ServiceContractAttribute.SessionMode property on your service contract interface or class to the value of the System.ServiceModel.SessionMode enumeration to specify whether the contract:

  • Requiert une session.Requires a session.

  • Permet à un client d'établir une session.Allows a client to establish a session.

  • Interdit une session.Prohibits a 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.Setting the SessionMode property does not, however, specify the type of session-based behavior the contract requires. Il demande à WCF de confirmer au moment de l’exécution que la liaison configurée (qui crée le canal de communication) pour le service ne, ne fait pas, ou peut établir une session lors de la mise en œuvre d’un service.It instructs WCF to confirm at runtime that the configured binding (which creates the communication channel) for the service does, does not, or can establish a session when implementing a 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.Again, the binding can satisfy that requirement with any type of session-based behavior it chooses—security, transport, reliable, or some combination. Le comportement exact dépend de la valeur System.ServiceModel.SessionMode sélectionnée.The exact behavior depends on the System.ServiceModel.SessionMode value selected. Si la liaison configurée du service n'est pas conforme à la valeur SessionMode, une exception est levée.If the configured binding of the service does not conform to the value of SessionMode, an exception is thrown. Les liaisons et les canaux créés prenant en charge ces sessions sont dits « basés sur session ».Bindings and the channels they create that support sessions are said to be session-based.

Le contrat de service suivant spécifie que toutes les opérations de la ICalculatorSession doivent être échangées dans une session.The following service contract specifies that all operations in the ICalculatorSession must be exchanged within a session. Aucune des opérations ne retourne une valeur à l'appelant sauf la méthode Equals .None of the operations returns a value to the caller except the Equals method. 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.However, the Equals method takes no parameters and, therefore, can only return a non-zero value inside a session in which data has already been passed to the other operations. Ce contrat requiert qu'une session fonctionne correctement.This contract requires a session to function properly. 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.Without a session associated with a specific client, the service instance has no way of knowing what previous data this client has sent.

[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.If a service allows a session, then a session is established and used if the client initiates one; otherwise, no session is established.

Sessions et instances de serviceSessions and Service Instances

Si vous utilisez le comportement d’instancing par défaut dans WCF, tous les appels entre un objet client WCF sont traités par la même instance de service.If you use the default instancing behavior in WCF, all calls between a WCF client object are handled by the same service instance. 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.Therefore, at the application level, you can think of a session as enabling application behavior similar to local call behavior. Par exemple, lorsque vous créez un objet local :For example, when you create a local object:

  • Un constructeur est appelé.A constructor is called.

  • Tous les appels ultérieurs effectués à la référence de l’objet client WCF sont traités par la même instance d’objet.All subsequent calls made to the WCF client object reference are processed by the same object instance.

  • Un destructeur est appelé lorsque la référence d'objet est détruite.A destructor is called when the object reference is destroyed.

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é.Sessions enable a similar behavior between clients and services as long as the default service instance behavior is used. 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 .If a service contract requires or supports sessions, one or more contract operations can be marked as initiating or terminating a session by setting the IsInitiating and IsTerminating properties.

Lesopérations d'initialisation sont celles qui doivent être appelées comme première opération d'une nouvelle session.Initiating operations are those that must be called as the first operation of a new session. Vous devez appeler au moins une opération d'initialisation avant de pouvoir appeler d'autres opérations.Non-initiating operations can be called only after at least one initiating operation has been called. 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.You can therefore create a kind of session constructor for your service by declaring initiating operations designed to take input from clients appropriate to the beginning of the service instance. (Toutefois, l'état est associé à la session et pas à l'objet de service.)(The state is associated with the session, however, and not the service object.)

Lesopérations de fin, inversement, doivent être appelées comme dernier message dans une session existante.Terminating operations, conversely, are those that must be called as the last message in an existing session. 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é.In the default case, WCF recycles the service object and its context after the session with which the service was associated is closed. 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.You can, therefore, create a kind of destructor by declaring terminating operations designed to perform a function appropriate to the end of the service instance.

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.Although the default behavior bears a resemblance to local constructors and destructors, it is only a resemblance. Toute opération de service WCF peut être une opération d’initiation ou de cessation d’activité, ou les deux en même temps.Any WCF service operation can be an initiating or terminating operation, or both at the same time. 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 ).In addition, in the default case, initiating operations can be called any number of times in any order; no additional sessions are created once the session is established and associated with an instance unless you explicitly control the lifetime of the service instance (by manipulating the System.ServiceModel.InstanceContext object). Enfin, l'état est associé à la session et pas l'objet de service.Finally, the state is associated with the session and not the service object.

Par exemple, ICalculatorSession le contrat utilisé dans l’exemple précédent exige Clear que l’objet client WCF appelle d’abord l’opération Equals avant toute autre opération et que la session avec cet objet client WCF se termine lorsqu’elle appelle l’opération.For example, the ICalculatorSession contract used in the preceding example requires that the WCF client object first call the Clear operation prior to any other operation and that the session with this WCF client object should terminate when it calls the Equals operation. L'exemple de code suivant montre un contrat qui applique ces spécifications.The following code example shows a contract that enforces these requirements. Clear doit être appelé en premier pour initialiser une session, et cette session se termine lorsque Equals est appelé.Clear must be called first to initiate a session, and that session ends when Equals is called.

[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.Services do not start sessions with clients. Dans les applications clients WCF, il existe une relation directe entre la durée de vie du canal basé sur la session et la durée de vie de la session elle-même.In WCF client applications, a direct relationship exists between the lifetime of the session-based channel and the lifetime of the session itself. 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.As such, clients create new sessions by creating new session-based channels and tear down existing sessions by closing session-based channels gracefully. Un client démarre une session avec un point de terminaison de service en appelant l'un des éléments suivants :A client starts a session with a service endpoint by calling one of the following:

Habituellement, un client termine une session avec un point de terminaison de service en appelant l'un des éléments suivants :Typically a client ends a session with a service endpoint by calling one of the following:

  • ICommunicationObject.Close sur le canal retourné par un appel à ChannelFactory<TChannel>.CreateChannel.ICommunicationObject.Close on the channel returned by a call to ChannelFactory<TChannel>.CreateChannel.

  • ClientBase<TChannel>.Closesur l’objet client WCF généré par Svcutil.exe.ClientBase<TChannel>.Close on the WCF client object generated by Svcutil.exe.

  • Une opération de résiliation sur l’un ou l’autre type d’objet client WCF (par défaut, aucune opération ne se termine; le contrat doit spécifier explicitement une opération de résiliation).A terminating operation on either type of WCF client object (by default, no operations are terminating; the contract must explicitly specify a terminating operation). Lorsque la première opération est appelée, l’objet client WCF ouvre automatiquement le canal et lance une session.When the first operation is called, the WCF client object automatically opens the channel and initiates a session.

Pour obtenir des exemples, consultez How to: Create a Service That Requires Sessions ainsi que Default Service Behavior et Instancing .For examples, see How to: Create a Service That Requires Sessions as well as the Default Service Behavior and Instancing samples.

Pour plus d’informations sur les clients et les sessions, voir Accès aux services à l’aide d’un client WCF.For more information about clients and sessions, see Accessing Services Using a WCF Client.

Sessions interagissant avec les paramètres InstanceContextSessions Interact with InstanceContext Settings

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.There is an interaction between the SessionMode enumeration in a contract and the ServiceBehaviorAttribute.InstanceContextMode property, which controls the association between channels and specific service objects. Pour plus d’informations, voir Sessions, Instancing, et Concurrency.For more information, see Sessions, Instancing, and Concurrency.

Partage d'objets InstanceContextSharing InstanceContext Objects

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.You can also control which session-based channel or call is associated with which InstanceContext object by performing that association yourself.

Sessions et diffusion en continuSessions and Streaming

Lorsque vous avez une grande quantité de données à transférer, le mode de transfert en continu dans WCF est une alternative possible au comportement par défaut de la mise en mémoire des messages tampons et de traitement de la mémoire dans leur intégralité.When you have a large amount of data to transfer, the streaming transfer mode in WCF is a feasible alternative to the default behavior of buffering and processing messages in memory in their entirety. Vous pouvez obtenir un comportement inattendu lors de la diffusion en continu des appels avec une liaison basée sur session.You may get unexpected behavior when streaming calls with a session-based binding. 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.All streaming calls are made through a single channel (the datagram channel) that does not support sessions even if the binding being used is configured to use 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é.If multiple clients make streaming calls to the same service object over a session-based binding, and the service object's concurrency mode is set to single and its instance context mode is set to PerSession, all calls must go through the datagram channel and so only one call is processed at a time. Un ou plusieurs clients peuvent alors s’évanouir. Vous pouvez contourner ce problème en définissant InstanceContextMode PerCall l’objet de service ou en concevant à plusieurs.One or more clients may then time out. You can work around this issue by either setting the service object's InstanceContextMode to PerCall or Concurrency to multiple.

Notes

MaxConcurrentSessions n'a aucun effet dans ce cas car une seule « session » est disponible.MaxConcurrentSessions have no effect in this case because there is only one "session" available.

Voir aussiSee also