Sesiones, creación de instancias y concurrencia
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. La concurrencia 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 System.ServiceModel.ServiceContractAttribute.SessionMode en System.ServiceModel.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 siguientes características conceptuales principales:
- 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 en el que se recibieron.
- 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, podría observar las siguientes diferencias entre ese tipo de sesión y las sesiones de WCF:
- Las sesiones ASP.NET siempre son iniciadas por servidor.
- Las sesiones ASP.NET están implícitamente desordenadas.
- Las sesiones ASP.NET proporcionan un mecanismo del almacenamiento de datos general para todas 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.
Creación de instancias
El comportamiento de la creación de instancias (establecido mediante el uso de la propiedad System.ServiceModel.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 System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode controla la frecuencia con la que se publica el InstanceContext, las propiedades System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode y System.ServiceModel.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 System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode en Single o se producirá una excepción al abrir el host del servicio.
Utilice el constructor System.ServiceModel.ServiceHost.#ctor(System.Object,System.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 su tipo de implementación de servicio es difícil de construir (por ejemplo, si no implementa un constructor público predeterminado que no tiene 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 System.ServiceModel.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 System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode estuviera definida en System.ServiceModel.ReleaseInstanceMode.None para todas las operaciones.
Compartición 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. Para obtener un ejemplo completo, consulte InstanceContextSharing.
Concurrencia
La concurrencia es el control del número de subprocesos activos en InstanceContext en cualquier un momento. Esto se controla utilizando System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode con la enumeración ConcurrencyMode.
Los tres modos de concurrencia 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 concurrencia.
- Reentrant: cada instancia de servicio procesa a la vez un mensaje, pero acepta llamadas de operación reentrantes. El servicio sólo acepta estas llamadas cuando está llamando 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, consulte ConcurrencyMode.
El uso de concurrencia se relaciona con el modo de creación de instancias. En la creación de instancias PerCall, la concurrencia no es relevante, porque 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 System.ServiceModel.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 System.ServiceModel.ServiceContractAttribute.SessionMode y System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode del servicio.
Valor InstanceContextMode | Required | Allowed | NotAllowed |
---|---|---|---|
PerCall |
|
|
|
PerSession |
|
|
|
Single |
|
|
|
Consulte también
Tareas
Cómo crear un servicio que requiere sesiones
Cómo controlar la creación de instancias de servicio