Sesiones, creación de instancias y simultaneidad

Una sesión es una correlación de todos los mensajes enviados entre dos extremos. 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. Lasimultaneidad es el término dado al control del número de subprocesos que se ejecutan al mismo tiempo en un InstanceContext .

En este tema se describen estos valores, cómo utilizarlos y las diversas interacciones entre ellos.

Sesiones

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. Si un contrato especifica que permite sesiones pero no requiere una, los clientes pueden conectarse y establecer o no una sesión. 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.

Las sesiones de WCF tienen las características conceptuales principales siguientes:

  • La aplicación que realiza la llamada inicia y finaliza explícitamente las sesiones.

  • Los mensajes entregados durante una sesión se procesan en el orden de recepción.

  • Las sesiones correlacionan un grupo de mensajes en una conversación. El significado de esa correlación es una abstracción. 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. Las características que se pueden derivar a partir de la sesión dependen de la naturaleza de la correlación.

  • No hay ningún almacén de datos general asociado a una sesión de WCF.

Si está familiarizado con la clase System.Web.SessionState.HttpSessionState en aplicaciones ASP.NET y la funcionalidad que proporciona, puede que observe las siguientes diferencias entre ese tipo de sesión y las sesiones de WCF:

  • Las sesiones de ASP.NET siempre se inician en el servidor.

  • Las sesiones de ASP.NET están implícitamente desordenadas.

  • Las sesiones de ASP.NET proporcionan un mecanismo de almacenamiento de datos general entre las solicitudes.

Las aplicaciones de cliente y servicio interactúan con sesiones de maneras diferentes. Las aplicaciones cliente inician sesiones y, a continuación, reciben y procesan los mensajes enviados dentro de la sesión. Las aplicaciones de servicio pueden utilizar sesiones como un punto de la extensibilidad para agregar comportamiento adicional. Esto se realiza trabajando directamente con InstanceContext o implementando un proveedor de contexto de instancia personalizado.

Instanciación

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. 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. La enumeración InstanceContextMode define los modos de creación de instancias.

Los siguientes modos de creación de instancias están disponibles:

  • PerCall: Un nuevo InstanceContext (y, por consiguiente, objeto de servicio) se crea para cada solicitud de cliente.

  • 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).

  • Single: Un InstanceContext único (y, por consiguiente, objeto de servicio) administra todas las solicitudes de cliente durante la vida de la aplicación.

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.

[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.

Servicios conocidos singleton

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. Para hacerlo, debe establecer también la propiedad ServiceBehaviorAttribute.InstanceContextMode en Single o se producirá una excepción al abrir el host del servicio.

Utilice el constructor ServiceHost(Object, Uri[]) para crear este tipo de servicio. 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. Puede utilizar esta sobrecarga cuando el tipo de implementación del servicio es difícil de construir (por ejemplo, si no implementa un constructor público sin parámetros).

Tenga en cuenta que cuando se proporciona un objeto a este constructor, algunas características relacionadas con el comportamiento de creación de instancias de Windows Communication Foundation (WCF) funcionan de manera diferente. Por ejemplo, llamar a InstanceContext.ReleaseServiceInstance , no tiene ningún efecto cuando se proporciona una instancia de objeto singleton. De igual forma, se omite cualquier otro mecanismo de publicación de instancia. ServiceHost siempre se comporta como si la propiedad OperationBehaviorAttribute.ReleaseInstanceMode estuviera definida en ReleaseInstanceMode.None para todas las operaciones.

Uso compartido de objetos InstanceContext

También puede controlar que canal con sesión o llamada se asocia a qué objeto InstanceContext realizando esa asociación usted mismo.

Simultaneidad

La simultaneidad es el control del número de subprocesos activos en InstanceContext en cualquier un momento. Esto se controla utilizando ServiceBehaviorAttribute.ConcurrencyMode con la enumeración ConcurrencyMode .

Los tres modos de simultaneidad siguientes están disponibles:

  • Single: cada contexto de instancia puede tener a la vez un máximo de un subproceso procesando mensajes en el contexto de la instancia. 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.

  • Multiple: cada instancia de servicio puede tener varios subprocesos procesando mensajes al mismo tiempo. La implementación del servicio debe ser segura para los subprocesos para utilizar este modo de simultaneidad.

  • Reentrant: cada instancia de servicio procesa a la vez un mensaje, pero acepta llamadas de operación reentrantes. El servicio solo acepta estas llamadas cuando llama al exterior través de un objeto de cliente WCF.

Nota

Entender y desarrollar código que use de manera segura más de un subproceso puede ser difícil de escribir correctamente. Antes de utilizar los valores Multiple o Reentrant , asegúrese de que su servicio está diseñado correctamente para estos modos. Para obtener más información, vea ConcurrencyMode.

El uso de simultaneidad se relaciona con el modo de creación de instancias. En la creación de instancias de PerCall, la simultaneidad no es relevante, ya que un nuevo InstanceContext procesa cada mensaje y, por consiguiente, nunca hay más de un subproceso activo en InstanceContext.

El siguiente ejemplo de código demuestra cómo establecer la propiedad ConcurrencyMode en Multiple.

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

Las sesiones interactúan con la configuración de InstanceContext

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.

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.

Valor InstanceContextMode Required Allowed NotAllowed
PerCall - Comportamiento con canal con sesión: una sesión y un objeto InstanceContext para cada llamada.
- Comportamiento con canal sin sesión: se produce una excepción.
- Comportamiento con canal con sesión: una sesión y un objeto InstanceContext para cada llamada.
- Comportamiento con canal sin sesión: un objeto InstanceContext para cada llamada.
- Comportamiento con canal con sesión: se produce una excepción.
- Comportamiento con canal sin sesión: un objeto InstanceContext para cada llamada.
PerSession - Comportamiento con canal con sesión: una sesión y un objeto InstanceContext para cada canal.
- Comportamiento con canal sin sesión: se produce una excepción.
- Comportamiento con canal con sesión: una sesión y un objeto InstanceContext para cada canal.
- Comportamiento con canal sin sesión: un objeto InstanceContext para cada llamada.
- Comportamiento con canal con sesión: se produce una excepción.
- Comportamiento con canal sin sesión: un objeto InstanceContext para cada llamada.
Single - Comportamiento con canal con sesión: una sesión y un objeto InstanceContext para todas las llamadas.
- Comportamiento con canal sin sesión: se produce una excepción.
- Comportamiento con canal con sesión: una sesión y un objeto InstanceContext para el singleton creado o especificado por el usuario.
- Comportamiento con canal sin sesión: un objeto InstanceContext para el singleton creado o especificado por el usuario.
- Comportamiento con canal con sesión: se produce una excepción.
- Comportamiento con canal sin sesión: un objeto InstanceContext para cada singleton creado o para el singleton especificado por el usuario.

Consulte también