Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En las aplicaciones de Windows Communication Foundation (WCF), una sesión correlaciona un grupo de mensajes en una conversación. Las sesiones de WCF son diferentes del objeto de sesión disponible en ASP.NET aplicaciones, admiten comportamientos diferentes y se controlan de maneras diferentes. En este tema se describen las características que las sesiones habilitan en las aplicaciones WCF y cómo usarlas.
Sesiones en aplicaciones de Windows Communication Foundation
Cuando un contrato de servicio especifica que requiere una sesión, ese contrato especifica 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 establecer una sesión. Si finaliza la sesión y se envía un mensaje a través del mismo canal, 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 (el cliente WCF).
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. Se pueden realizar diferentes tipos de correlació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.
En este tema se describen los siguientes elementos:
Comportamiento de ejecución predeterminado al usar enlaces basados en sesión en el nivel de modelo de servicio.
Los tipos de características que proporcionan los enlaces basados en sesión proporcionados por el sistema de WCF.
Cómo crear un contrato que declare un requisito de sesión.
Cómo comprender y controlar la creación y finalización de la sesión y la relación de la sesión con la instancia de servicio.
Comportamiento de ejecución predeterminado mediante sesiones
Un enlace que intenta iniciar una sesión se denomina enlace basado en sesión . Los contratos de servicio especifican que requieren, permiten o rechazan enlaces basados en sesión estableciendo la propiedad ServiceContractAttribute.SessionMode en la interfaz (o clase) del contrato de servicio en uno de los valores de enumeración del System.ServiceModel.SessionMode . De forma predeterminada, el valor de esta propiedad es Allowed, lo que significa que si un cliente usa un enlace basado en sesión con una implementación del servicio WCF, el servicio establece y usa la sesión proporcionada.
Cuando un servicio WCF acepta una sesión de cliente, las siguientes características están habilitadas de forma predeterminada:
Todas las llamadas entre un objeto de cliente WCF se controlan mediante la misma instancia de servicio.
Los diferentes enlaces basados en sesión proporcionan características adicionales.
System-Provided Tipos de sesión
Un enlace basado en sesión admite la asociación predeterminada de una instancia de servicio con una sesión determinada. Sin embargo, los diferentes enlaces basados en sesión admiten características diferentes además de habilitar el control de creación de instancias basado en sesión descrito anteriormente.
WCF proporciona los siguientes tipos de comportamiento de aplicación basado en sesión:
System.ServiceModel.Channels.SecurityBindingElement Admite sesiones basadas en seguridad, en las que ambos extremos de comunicación han acordado una conversación segura específica. Para obtener más información, consulte Seguridad de servicios. Por ejemplo, el System.ServiceModel.WSHttpBinding enlace, que contiene compatibilidad con sesiones de seguridad y sesiones confiables, de forma predeterminada usa solo una sesión segura que cifra y firma digitalmente los mensajes.
El enlace System.ServiceModel.NetTcpBinding admite las sesiones basadas en TCP/IP para asegurarse de que todos los mensajes están correlacionados por la conexión en el nivel de socket.
El System.ServiceModel.Channels.ReliableSessionBindingElement elemento , que implementa la especificación de WS-ReliableMessaging, proporciona compatibilidad con sesiones confiables en las que los mensajes se pueden configurar para que se entreguen en orden y exactamente una vez, lo que garantiza que los mensajes se reciben incluso cuando los mensajes viajan a través de varios nodos durante la conversación. Para obtener más información, consulte Reliable Sessions.
El enlace System.ServiceModel.NetMsmqBinding proporciona sesiones de datagrama de MSMQ. Para obtener más información, consulte Colas en WCF.
Establecer la SessionMode propiedad no especifica el tipo de sesión que requiere el contrato, solo que requiere uno.
Crear un contrato que requiera una sesión
La creación de un contrato que requiera una sesión indica que el grupo de operaciones que declara el contrato de servicio debe ejecutarse en la misma sesión y que los mensajes deben entregarse en orden. Para validar el nivel de compatibilidad de la sesión que requiere un contrato de servicio, establezca la propiedad ServiceContractAttribute.SessionMode de su clase o interfaz de contrato de servicio en el valor de la enumeración System.ServiceModel.SessionMode para especificar si el contrato:
Requiere una sesión.
Permite a un cliente establecer una sesión.
Prohíbe una sesión.
Sin embargo, establecer la SessionMode propiedad no especifica el tipo de comportamiento basado en sesión que requiere el contrato. Indica a WCF que confirme en tiempo de ejecución si el enlace configurado (que crea el canal de comunicación) para el servicio puede, no puede, o tiene la capacidad de establecer una sesión al implementar un servicio. De nuevo, la vinculación puede satisfacer ese requisito con cualquier tipo de comportamiento basado en sesión que elija: seguridad, confiabilidad, transporte o alguna combinación. El comportamiento exacto depende del System.ServiceModel.SessionMode valor seleccionado. Si el enlace configurado del servicio no se ajusta al valor de SessionMode, se produce una excepción. Los enlaces, y los canales que esos enlaces crean, que admiten sesiones se dice que son basados en sesión.
El siguiente contrato de servicio especifica que todas las operaciones de ICalculatorSession se deben intercambiar en el transcurso de una sesión. Ninguna de las operaciones devuelve un valor al autor de la llamada, excepto el Equals método . Sin embargo, el Equals método no toma parámetros y, por lo tanto, solo puede devolver un valor distinto de cero dentro de una sesión en la que los datos ya se han pasado a las otras operaciones. Para que este contrato funcione adecuadamente, es necesaria una sesión. Sin una sesión asociada a un cliente específico, la instancia de servicio no tiene forma de saber qué datos anteriores ha enviado este cliente.
[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 servicio permite una sesión, se establece y se usa una sesión si el cliente inicia una; de lo contrario, no se establece ninguna sesión.
Sesiones e instancias de servicios
Si usa el comportamiento de creación de instancias predeterminado en WCF, todas las llamadas entre un objeto de cliente WCF se controlan mediante la misma instancia de servicio. Por lo tanto, en el nivel de aplicación, puede pensar en una sesión como habilitar el comportamiento de la aplicación similar al comportamiento de las llamadas locales. Por ejemplo, al crear un objeto local:
Se llama a un constructor.
Todas las llamadas posteriores realizadas a la referencia de objeto de cliente WCF se procesan mediante la misma instancia de objeto.
Se llama a un destructor cuando se destruye la referencia al objeto.
Las sesiones permiten un comportamiento similar entre clientes y servicios siempre que se use el comportamiento predeterminado de la instancia de servicio. Si un contrato de servicio requiere o admite sesiones, una o varias operaciones de contrato se pueden marcar como iniciando o finalizando una sesión estableciendo las IsInitiating propiedades y IsTerminating .
Las operaciones de inicio son aquellas a las que se debe llamar como la primera operación de una nueva sesión. Las operaciones que no son de inicio sólo pueden llamarse después de que se haya llamado, al menos, a una operación de inicio. Puede crear, por consiguiente, un tipo de constructor de sesión para su servicio mediante la declaración de operaciones de inicio diseñadas para tomar entradas de clientes apropiadas para el inicio de la instancia de servicio. (Sin embargo, el estado está asociado a la sesión y no al objeto de servicio).
Las operaciones de terminación, por otro lado, son aquellas que deben ser llamadas como el último mensaje de una sesión existente. En el caso predeterminado, WCF recicla el objeto de servicio y su contexto después de cerrar la sesión con la que se ha asociado el servicio. Por consiguiente, puede crear un tipo de destructor declarando operaciones de finalización diseñadas para realizar una función adecuada al final de la instancia de servicio.
Nota:
Aunque el comportamiento predeterminado tiene un parecido a los constructores y destructores locales, es solo un parecido. Cualquier operación de servicio WCF puede ser una operación de inicio o finalización, o ambas al mismo tiempo. Además, en el caso predeterminado, las operaciones de inicio se pueden llamar a cualquier número de veces en cualquier orden; no se crean sesiones adicionales una vez establecida la sesión y asociada a una instancia, a menos que controle explícitamente la duración de la instancia de servicio (manipulando el System.ServiceModel.InstanceContext objeto). Por último, el estado está asociado a la sesión y no al objeto de servicio.
Por ejemplo, el ICalculatorSession contrato usado en el ejemplo anterior requiere que el objeto de cliente WCF llame primero a la Clear operación antes de cualquier otra operación y que la sesión con este objeto de cliente WCF debe finalizar cuando llama a la Equals operación. En el ejemplo de código siguiente se muestra un contrato que aplica estos requisitos.
Clear debe llamarse primero para iniciar una sesión, y esa sesión finaliza cuando se llama a Equals.
[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
Los servicios no inician sesiones con clientes. En las aplicaciones cliente WCF, existe una relación directa entre la duración del canal basado en sesión y la duración de la propia sesión. Como tal, los clientes crean nuevas sesiones creando nuevos canales basados en sesión y acaban con las sesiones existentes cerrando correctamente los canales basados en sesión. Un cliente inicia una sesión con un punto de conexión de servicio llamando a uno de los siguientes:
ICommunicationObject.Open en el canal devuelto por una llamada a ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Open en el objeto de cliente WCF generado por la Herramienta de Utilidad de Metadatos de ServiceModel (Svcutil.exe).
Una operación de inicio en cualquier tipo de objeto de cliente WCF (de forma predeterminada, todas las operaciones se inician). Cuando se llama a la primera operación, el objeto de cliente WCF abre automáticamente el canal e inicia una sesión.
Normalmente, un cliente finaliza una sesión con un punto de conexión de servicio llamando a uno de los siguientes:
ICommunicationObject.Close en el canal devuelto por una llamada a ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Close en el objeto de cliente WCF generado por Svcutil.exe.
Una operación de terminación en cualquier tipo de objeto de cliente WCF (de forma predeterminada, no se termina ninguna operación; el contrato debe especificar explícitamente una operación de terminación). Cuando se llama a la primera operación, el objeto de cliente WCF abre automáticamente el canal e inicia una sesión.
Para obtener ejemplos, consulte Cómo: Crear un servicio que requiera sesiones, así como los ejemplos Comportamiento predeterminado del servicio y Instancing.
Para obtener más información sobre los clientes y las sesiones, vea Accessing Services Using a WCF Client.
Sesiones interactúan con la configuración de InstanceContext
Hay una interacción entre la SessionMode enumeración en un contrato y la ServiceBehaviorAttribute.InstanceContextMode propiedad , que controla la asociación entre canales y objetos de servicio específicos. Para obtener más información, consulte Sesiones, creación de instancias y simultaneidad.
Uso compartido de objetos InstanceContext
También puede controlar qué canal o llamada basados en sesión están asociados con el objeto InstanceContext realizando esa asociación por usted mismo.
Sesiones y streaming
Cuando tiene una gran cantidad de datos para transferir, el modo de transferencia de streaming en WCF es una alternativa factible al comportamiento predeterminado de almacenamiento en búfer y procesamiento de mensajes en memoria en su totalidad. Es posible que se produzca un comportamiento inesperado al realizar transmisiones de llamadas con un enlace basado en sesión. Todas las llamadas de transmisión se realizan a través de un único canal (el canal de datagrama) que no admite sesiones, aunque el enlace utilizado esté configurado para usarlas. Si varios clientes realizan llamadas de streaming al mismo objeto de servicio a través de un enlace basado en sesión, y el modo de simultaneidad del objeto de servicio se establece en único y su modo de contexto de instancia se establece en PerSession, todas las llamadas deben pasar por el canal de datagrama y, por tanto, solo se procesa una llamada a la vez. Uno o varios clientes pueden agotar el tiempo de espera. Para solucionar este problema, puede establecer el InstanceContextMode del objeto de servicio en PerCall o Simultaneidad en varios.
Nota:
MaxConcurrentSessions no tiene ningún efecto en este caso porque solo hay una "sesión" disponible.