Sesiones, creación de instancias y simultaneidadSessions, Instancing, and Concurrency

Una sesión es una correlación de todos los mensajes enviados entre dos extremos.A session is a correlation of all messages sent between two endpoints. Creación de instancias hace referencia al control de la vida de los objetos de servicio definidos por el usuario y sus objetos InstanceContext relacionados.Instancing refers to controlling the lifetime of user-defined service objects and their related InstanceContext objects. Lasimultaneidad es el término dado al control del número de subprocesos que se ejecutan al mismo tiempo en un InstanceContext .Concurrency is the term given to the control of the number of threads executing in an InstanceContext at the same time.

En este tema se describen estos valores, cómo utilizarlos y las diversas interacciones entre ellos.This topic describes these settings, how to use them, and the various interactions between them.

SesionesSessions

Cuando un contrato de servicios establece la propiedad ServiceContractAttribute.SessionMode en SessionMode.Required, ese contrato está diciendo que todas las llamadas (es decir, los intercambios de mensajes subyacentes que admiten las llamadas) deben formar parte de la misma conversación.When a service contract sets the ServiceContractAttribute.SessionMode property to SessionMode.Required, that contract is saying that all calls (that is, the underlying message exchanges that support the calls) must be part of the same conversation. Si un contrato especifica que permite sesiones pero no requiere una, los clientes pueden conectarse y establecer o no una sesión.If a contract specifies that it allows sessions but does not require one, clients can connect and either establish a session or not. Si la sesión finaliza y se envía un mensaje se envía sobre el mismo canal basado en sesión, se produce una excepción.If the session ends and a message is sent over the same session-based channel an exception is thrown.

Las sesiones de WCF tienen las siguientes características conceptuales principales:WCF sessions have the following main conceptual features:

  • La aplicación que realiza la llamada inicia y finaliza explícitamente las sesiones.They are explicitly initiated and terminated by the calling application.

  • Los mensajes entregados durante una sesión se procesan en el orden de recepción.Messages delivered during a session are processed in the order in which they are received.

  • Las sesiones correlacionan un grupo de mensajes en una conversación.Sessions correlate a group of messages into a conversation. El significado de esa correlación es una abstracción.The meaning of that correlation is an abstraction. Por ejemplo, un canal basado en sesión puede correlacionar mensajes basados en una conexión de red compartida, mientras que otro canal basado en sesión puede correlacionar mensajes basados en una etiqueta compartida en el cuerpo del mensaje.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. Las características que se pueden derivar a partir de la sesión dependen de la naturaleza de la correlación.The features that can be derived from the session depend on the nature of the correlation.

  • No hay ningún almacén de datos general asociado a una sesión de WCF.There is no general data store associated with a WCF session.

Si está familiarizado con la clase System.Web.SessionState.HttpSessionState de las aplicaciones de ASP.NET y la funcionalidad que proporciona, podría observar las siguientes diferencias entre ese tipo de sesión y las sesiones de 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:

  • Las sesiones de ASP.NET siempre se inician en el servidor.ASP.NET sessions are always server-initiated.

  • Las sesiones de ASP.NET no están ordenadas de forma implícita.ASP.NET sessions are implicitly unordered.

  • Las sesiones de ASP.NET proporcionan un mecanismo de almacenamiento de datos general entre las solicitudes.ASP.NET sessions provide a general data storage mechanism across requests.

Las aplicaciones de cliente y servicio interactúan con sesiones de maneras diferentes.Client applications and service applications interact with sessions in different ways. Las aplicaciones cliente inician sesiones y, a continuación, reciben y procesan los mensajes enviados dentro de la sesión.Client applications initiate sessions and then receive and process the messages sent within the session. Las aplicaciones de servicio pueden utilizar sesiones como un punto de la extensibilidad para agregar comportamiento adicional.Service applications can use sessions as an extensibility point to add additional behavior. Esto se realiza trabajando directamente con InstanceContext o implementando un proveedor de contexto de instancia personalizado.This is done by working directly with the InstanceContext or implementing a custom instance context provider.

Creación de instanciasInstancing

El comportamiento de la creación de instancias (establecido mediante el uso de la propiedad ServiceBehaviorAttribute.InstanceContextMode ) controla cómo InstanceContext se crea en respuesta a los mensajes entrantes.The instancing behavior (set by using the ServiceBehaviorAttribute.InstanceContextMode property) controls how the InstanceContext is created in response to incoming messages. De forma predeterminada, InstanceContext está asociado a un objeto de servicio definido por el usuario, estableciendo así (en el caso predeterminado) la propiedad InstanceContextMode , también se controla la creación de instancias de objetos de servicio definidos por el usuario.By default, each InstanceContext is associated with one user-defined service object, so (in the default case) setting the InstanceContextMode property also controls the instancing of user-defined service objects. La enumeración InstanceContextMode define los modos de creación de instancias.The InstanceContextMode enumeration defines the instancing modes.

Los siguientes modos de creación de instancias están disponibles:The following instancing modes are available:

  • PerCall: Un nuevo InstanceContext (y, por consiguiente, objeto de servicio) se crea para cada solicitud de cliente.PerCall: A new InstanceContext (and therefore service object) is created for each client request.

  • PerSession: Un nuevo InstanceContext (y, por consiguiente, objeto de servicio) se crea para cada nueva sesión del cliente y se mantiene durante el tiempo que dure esa sesión (esto requiere un enlace que admita sesiones).PerSession: A new InstanceContext (and therefore service object) is created for each new client session and maintained for the lifetime of that session (this requires a binding that supports sessions).

  • Single: Un InstanceContext único (y, por consiguiente, objeto de servicio) administra todas las solicitudes de cliente durante la vida de la aplicación.Single: A single InstanceContext (and therefore service object) handles all client requests for the lifetime of the application.

El ejemplo de código siguiente muestra el valor predeterminado de InstanceContextMode , PerSession que se establecen de manera explícita en una clase de servicio.The following code example shows the default InstanceContextMode value, PerSession being explicitly set on a service class.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]   
public class CalculatorService : ICalculatorInstance   
{   
    ...  
}  

Y mientras la propiedad ServiceBehaviorAttribute.InstanceContextMode controla la frecuencia con la que se publica el InstanceContext , las propiedades OperationBehaviorAttribute.ReleaseInstanceMode y ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete controlan cuando se publica el objeto de servicio.And while the ServiceBehaviorAttribute.InstanceContextMode property controls how often the InstanceContext is released, the OperationBehaviorAttribute.ReleaseInstanceMode and ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete properties control when the service object is released.

Servicios conocidos singletonWell-Known Singleton Services

Una variación en objetos de servicio de instancia únicos es útil a veces: puede crear un objeto de servicio y crear el host del servicio mediante ese objeto.One variation on single instance service objects is sometimes useful: you can create a service object yourself and create the service host using that object. Para hacerlo, debe establecer también la propiedad ServiceBehaviorAttribute.InstanceContextMode en Single o se producirá una excepción al abrir el host del servicio.To do so, you must also set the ServiceBehaviorAttribute.InstanceContextMode property to Single or an exception is thrown when the service host is opened.

Utilice el constructor ServiceHost.ServiceHost(Object, Uri[]) para crear este tipo de servicio.Use the ServiceHost.ServiceHost(Object, Uri[]) constructor to create such a service. Ofrece una alternativa para implementar un System.ServiceModel.Dispatcher.IInstanceContextInitializer personalizado cuando desee proporcionar una instancia de objeto concreta para su uso con el servicio de singleton.It provides an alternative to implementing a custom System.ServiceModel.Dispatcher.IInstanceContextInitializer when you wish to provide a specific object instance for use by a singleton service. Puede usar esta sobrecarga cuando su tipo de implementación de servicio es difícil de construir (por ejemplo, si no implementa un constructor público sin parámetros).You can use this overload when your service implementation type is difficult to construct (for example, if it does not implement a parameterless public constructor).

Tenga en cuenta que cuando se proporciona un objeto a este constructor, algunas características relacionadas con el comportamiento de la creación de instancias de Windows Communication Foundation (WCF) funcionan de manera diferente.Note that when an object is provided to this constructor, some features related to the Windows Communication Foundation (WCF) instancing behavior work differently. Por ejemplo, llamar a InstanceContext.ReleaseServiceInstance , no tiene ningún efecto cuando se proporciona una instancia de objeto singleton.For example, calling InstanceContext.ReleaseServiceInstance has no effect when a singleton object instance is provided. De igual forma, se omite cualquier otro mecanismo de publicación de instancia.Similarly, any other instance-release mechanism is ignored. ServiceHost siempre se comporta como si la propiedad OperationBehaviorAttribute.ReleaseInstanceMode estuviera definida en ReleaseInstanceMode.None para todas las operaciones.The ServiceHost always behaves as if the OperationBehaviorAttribute.ReleaseInstanceMode property is set to ReleaseInstanceMode.None for all operations.

Uso compartido de objetos InstanceContextSharing InstanceContext Objects

También puede controlar que canal con sesión o llamada se asocia a qué objeto InstanceContext realizando esa asociación usted mismo.You can also control which sessionful channel or call is associated with which InstanceContext object by performing that association yourself.

simultaneidadConcurrency

La simultaneidad es el control del número de subprocesos activos en InstanceContext en cualquier un momento.Concurrency is the control of the number of threads active in an InstanceContext at any one time. Esto se controla utilizando ServiceBehaviorAttribute.ConcurrencyMode con la enumeración ConcurrencyMode .This is controlled by using the ServiceBehaviorAttribute.ConcurrencyMode with the ConcurrencyMode enumeration.

Los tres modos de simultaneidad siguientes están disponibles:The following three concurrency modes are available:

  • Single: cada contexto de instancia puede tener a la vez un máximo de un subproceso procesando mensajes en el contexto de la instancia.Single: Each instance context is allowed to have a maximum of one thread processing messages in the instance context at a time. El resto de subprocesos que deseen utilizar el mismo contexto de instancia se deben bloquear hasta que el subproceso original salga del contexto de la instancia.Other threads wishing to use the same instance context must block until the original thread exits the instance context.

  • Multiple: cada instancia de servicio puede tener varios subprocesos procesando mensajes al mismo tiempo.Multiple: Each service instance can have multiple threads processing messages concurrently. La implementación del servicio debe ser segura para los subprocesos para utilizar este modo de simultaneidad.The service implementation must be thread-safe to use this concurrency mode.

  • Reentrant: cada instancia de servicio procesa a la vez un mensaje, pero acepta llamadas de operación reentrantes.Reentrant: Each service instance processes one message at a time, but accepts re-entrant operation calls. El servicio solo acepta estas llamadas cuando está llamando a a través de un objeto de cliente de WCF.The service only accepts these calls when it is calling out through a WCF client object.

Nota

Entender y desarrollar código que use de manera segura más de un subproceso puede ser difícil de escribir correctamente.Understanding and developing code that safely uses more than one thread can be difficult to write successfully. Antes de utilizar los valores Multiple o Reentrant , asegúrese de que su servicio está diseñado correctamente para estos modos.Before using Multiple or Reentrant values, ensure that your service is properly designed for these modes. Para obtener más información, vea ConcurrencyMode.For more information, see ConcurrencyMode.

El uso de simultaneidad se relaciona con el modo de creación de instancias.The use of concurrency is related to the instancing mode. En la creación de instancias de PerCall, la simultaneidad no es pertinente, ya que cada mensaje se procesa mediante un nuevo InstanceContext y, por lo tanto, nunca hay más de un subproceso activo en la InstanceContext.In PerCall instancing, concurrency is not relevant, because each message is processed by a new InstanceContext and, therefore, never more than one thread is active in the InstanceContext.

El siguiente ejemplo de código demuestra cómo establecer la propiedad ConcurrencyMode en Multiple.The following code example demonstrates setting the ConcurrencyMode property to Multiple.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]   
public class CalculatorService : ICalculatorConcurrency   
{   
    ...  
}  

Las sesiones interactúan con la configuración de InstanceContextSessions Interact with InstanceContext Settings

Las sesiones y InstanceContext interactúan dependiendo de la combinación del valor de la enumeración SessionMode en un contrato y la propiedad ServiceBehaviorAttribute.InstanceContextMode en la implementación del servicio, que controla la asociación entre los canales y los objetos de servicio concretos.Sessions and InstanceContext interact depending upon the combination of the value of the SessionMode enumeration in a contract and the ServiceBehaviorAttribute.InstanceContextMode property on the service implementation, which controls the association between channels and specific service objects.

La tabla siguiente muestra el resultado de un canal entrante que admite o no sesiones dada una combinación de los valores de las propiedades ServiceContractAttribute.SessionMode y ServiceBehaviorAttribute.InstanceContextMode del servicio.The following table shows the result of an incoming channel either supporting sessions or not supporting sessions given a service's combination of the values of the ServiceContractAttribute.SessionMode property and the ServiceBehaviorAttribute.InstanceContextMode property.

Valor InstanceContextModeInstanceContextMode value Required Allowed NotAllowed
PerCallPerCall -Comportamiento con canal con sesión: una sesión y InstanceContext para cada llamada.- Behavior with sessionful channel: A session and InstanceContext for each call.
-Comportamiento con canal sin sesión: se produce una excepción.- Behavior with sessionless channel: An exception is thrown.
-Comportamiento con canal con sesión: una sesión y InstanceContext para cada llamada.- Behavior with sessionful channel: A session and InstanceContext for each call.
-Comportamiento con canal sin sesión: un InstanceContext para cada llamada.- Behavior with sessionless channel: An InstanceContext for each call.
-Comportamiento con canal con sesión: se produce una excepción.- Behavior with sessionful channel: An exception is thrown.
-Comportamiento con canal sin sesión: un InstanceContext para cada llamada.- Behavior with sessionless channel: An InstanceContext for each call.
PerSessionPerSession -Comportamiento con canal con sesión: una sesión y InstanceContext para cada canal.- Behavior with sessionful channel: A session and InstanceContext for each channel.
-Comportamiento con canal sin sesión: se produce una excepción.- Behavior with sessionless channel: An exception is thrown.
-Comportamiento con canal con sesión: una sesión y InstanceContext para cada canal.- Behavior with sessionful channel: A session and InstanceContext for each channel.
-Comportamiento con canal sin sesión: un InstanceContext para cada llamada.- Behavior with sessionless channel: An InstanceContext for each call.
-Comportamiento con canal con sesión: se produce una excepción.- Behavior with sessionful channel: An exception is thrown.
-Comportamiento con canal sin sesión: un InstanceContext para cada llamada.- Behavior with sessionless channel: An InstanceContext for each call.
SingleSingle -Comportamiento con canal con sesión: una sesión y una InstanceContext para todas las llamadas.- Behavior with sessionful channel: A session and one InstanceContext for all calls.
-Comportamiento con canal sin sesión: se produce una excepción.- Behavior with sessionless channel: An exception is thrown.
-Comportamiento con canal con sesión: una sesión y InstanceContext para el singleton creado o especificado por el usuario.- Behavior with sessionful channel: A session and InstanceContext for the created or user-specified singleton.
-Comportamiento con canal sin sesión: un InstanceContext para el singleton creado o especificado por el usuario.- Behavior with sessionless channel: An InstanceContext for the created or user-specified singleton.
-Comportamiento con canal con sesión: se produce una excepción.- Behavior with sessionful channel: An exception is thrown.
-Comportamiento con canal sin sesión: un InstanceContext para cada singleton creado o para el singleton especificado por el usuario.- Behavior with sessionless channel: An InstanceContext for each created singleton or for the user-specified singleton.

Vea tambiénSee also