Compartir a través de


Sesiones, creación de instancias y simultaneidad

Una sesión es una correlación de todos los mensajes enviados entre dos puntos de conexión. 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. La simultaneidad 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 estas opciones de configuración, cómo usarlas y las distintas interacciones entre ellos.

Sesiones

Cuando un contrato de servicio establece la propiedad ServiceContractAttribute.SessionMode en SessionMode.Required, ese contrato establece 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 una sesión o no. 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 siguientes características conceptuales principales:

  • Se inician y finalizan explícitamente mediante la aplicación que realiza la llamada.

  • Los mensajes entregados durante una sesión se procesan en el orden en que se reciben.

  • 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 los mensajes en función de una conexión de red compartida, mientras que otro canal basado en sesión puede correlacionar los mensajes en función de una etiqueta compartida en el cuerpo del mensaje. Las características que se pueden derivar 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 System.Web.SessionState.HttpSessionState clase de ASP.NET aplicaciones y la funcionalidad que proporciona, es posible que observe las siguientes diferencias entre ese tipo de sesión y las sesiones wcF:

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

  • ASP.NET sesiones no están ordenadas implícitamente.

  • Las sesiones de ASP.NET proporcionan un mecanismo de almacenamiento de datos general a través de solicitudes.

Las aplicaciones cliente y las aplicaciones de servicio interactúan con sesiones de diferentes maneras. 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 usar sesiones como un punto de extensibilidad para agregar un comportamiento adicional. Esto se hace trabajando directamente con el 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, cada InstanceContext está asociado a un objeto de servicio definido por el usuario, por lo que (en el caso predeterminado) al establecer la propiedad InstanceContextMode también crea instancias de objetos de servicio definidos por el usuario. La InstanceContextMode enumeración define los modos de creación de instancias.

Están disponibles los siguientes modos de creación de instancias:

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

  • PerSession: se crea un nuevo InstanceContext objeto (y, por tanto, objeto de servicio) para cada nueva sesión de cliente y se mantiene durante la vigencia de esa sesión (esto requiere un enlace que admita sesiones).

  • Single: Un único InstanceContext objeto de servicio maneja todas las solicitudes de cliente durante la vigencia de la aplicación.

En el ejemplo de código siguiente se muestra el valor predeterminado InstanceContextMode , PerSession que se establece explícitamente 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 InstanceContext se libera, las propiedades OperationBehaviorAttribute.ReleaseInstanceMode y ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete controlan cuándo se libera el objeto de servicio.

Well-Known Singleton Services

A veces resulta útil una variación en los objetos de servicio de instancia única: puede crear un objeto de servicio usted mismo y crear el host de servicio mediante ese objeto. Para ello, también debe establecer la propiedad ServiceBehaviorAttribute.InstanceContextMode en Single, de lo contrario, se producirá una excepción cuando se abre el host de servicio.

Use el ServiceHost(Object, Uri[]) constructor para crear este servicio. Proporciona una alternativa a la implementación personalizada de un System.ServiceModel.Dispatcher.IInstanceContextInitializer al desear proporcionar una instancia de un objeto específico para su uso en un servicio singleton. Puede usar esta sobrecarga cuando el tipo de implementación de servicio sea 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 forma diferente. Por ejemplo, llamar a InstanceContext.ReleaseServiceInstance no tiene ningún efecto cuando se proporciona una instancia de objeto singleton. Del mismo modo, se ignora cualquier otro mecanismo de liberación de instancia. Siempre, ServiceHost se comporta como si la propiedad OperationBehaviorAttribute.ReleaseInstanceMode está configurada en ReleaseInstanceMode.None para todas las operaciones.

Uso compartido de objetos InstanceContext

También puede controlar qué canal o llamada con sesión se asocia a qué objeto InstanceContext llevando a cabo usted mismo dicha asociación.

Simultaneidad

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

Los tres modos de simultaneidad siguientes están disponibles:

  • Single: Cada contexto de instancia puede tener un máximo de un subproceso procesando mensajes en el contexto de instancia a la vez. Otros subprocesos que deseen usar el mismo contexto de instancia deben bloquearse hasta que el subproceso original salga del contexto de instancia.

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

  • Reentrant: Cada instancia de servicio procesa un mensaje a la vez, pero acepta llamadas de operación reentrante. El servicio solo acepta estas llamadas cuando se llama a 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 usar Multiple o Reentrant valores, asegúrese de que el servicio está diseñado correctamente para estos modos. Para obtener más información, consulte ConcurrencyMode.

El uso de la simultaneidad está relacionado con el modo de creación de instancias. En la instanciación PerCall, la concurrencia no es relevante, ya que cada mensaje es procesado por una nueva InstanceContext y, por lo tanto, nunca hay más de un subproceso activo en InstanceContext.

En el ejemplo de código siguiente se muestra cómo establecer la ConcurrencyMode propiedad en Multiple.

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

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.

En la tabla siguiente se muestra el resultado de un canal de entrada que admite sesiones o no admite sesiones, dada la combinación de los valores de la propiedad ServiceContractAttribute.SessionMode y la propiedad ServiceBehaviorAttribute.InstanceContextMode de un 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.
Soltero - 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