SessionMode Enumeración
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Especifica los valores disponibles para indicar la compatibilidad para las sesiones confiables que un contrato requiere o admite.
public enum class SessionMode
public enum SessionMode
type SessionMode =
Public Enum SessionMode
- Herencia
Campos
Allowed | 0 | Especifica que el contrato admite las sesiones si el enlace entrante las admite. |
NotAllowed | 2 | Especifica que el contrato nunca admite los enlaces que inician las sesiones. |
Required | 1 | Especifica que el contrato requiere un enlace con sesión. Se produce una excepción si no se configuró el enlace para admitir la sesión. |
Ejemplos
En el ejemplo de código siguiente se muestra cómo usar la SessionMode propiedad de ServiceContractAttribute para especificar que el IMyService
contrato de servicio requiere enlaces que admitan el estado de sesión.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Name = "SampleDuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract),
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
[OperationContract(IsOneWay = true)]
void Hello(string greeting);
}
public interface IHelloCallbackContract
{
[OperationContract(IsOneWay = true)]
void Reply(string responseToGreeting);
}
[ServiceBehaviorAttribute(InstanceContextMode=InstanceContextMode.PerSession)]
public class DuplexHello : IDuplexHello
{
public DuplexHello()
{
Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
}
~DuplexHello()
{
Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
}
public void Hello(string greeting)
{
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
Console.WriteLine("Waiting two seconds before returning call.");
// Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000);
IHelloCallbackContract callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
Console.WriteLine("Sending back: " + response);
callerProxy.Reply(response);
}
}
}
Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Threading
Namespace Microsoft.WCF.Documentation
<ServiceContract(Name:="SampleDuplexHello", Namespace:="http://microsoft.wcf.documentation", _
CallbackContract:=GetType(IHelloCallbackContract), SessionMode:=SessionMode.Required)> _
Public Interface IDuplexHello
<OperationContract(IsOneWay:=True)> _
Sub Hello(ByVal greeting As String)
End Interface
Public Interface IHelloCallbackContract
<OperationContract(IsOneWay := True)> _
Sub Reply(ByVal responseToGreeting As String)
End Interface
<ServiceBehaviorAttribute(InstanceContextMode:=InstanceContextMode.PerSession)> _
Public Class DuplexHello
Implements IDuplexHello
Public Sub New()
Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
End Sub
Public Sub Hello(ByVal greeting As String) Implements IDuplexHello.Hello
Console.WriteLine("Caller sent: " & greeting)
Console.WriteLine("Session ID: " & OperationContext.Current.SessionId)
Console.WriteLine("Waiting two seconds before returning call.")
' Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000)
Dim callerProxy As IHelloCallbackContract = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
Console.WriteLine("Sending back: " & response)
callerProxy.Reply(response)
End Sub
End Class
End Namespace
Comentarios
Use la SessionMode enumeración con la ServiceContractAttribute.SessionMode propiedad para requerir, permitir o prohibir enlaces para usar sesiones entre puntos de conexión que se conectan o admiten el contrato de servicio. Una sesión es una manera de poner en correlación un conjunto de mensajes intercambiados entre dos o más extremos. Para obtener más información sobre las sesiones, consulte Uso de sesiones.
Si el servicio admite sesiones, puede usar la ServiceBehaviorAttribute.InstanceContextMode propiedad para especificar la relación entre instancias de la implementación del contrato de servicio y la sesión del canal.
Por ejemplo, si la ServiceContractAttribute.SessionMode propiedad se establece Allowed
en y la ServiceBehaviorAttribute.InstanceContextMode propiedad está establecida InstanceContextMode.PerSessionen , un cliente puede usar un enlace que admita sesiones confiables para realizar llamadas repetidas al mismo objeto de servicio.
Dado que una sesión es un concepto de nivel de canal que usa el modelo de aplicación, existe una interacción entre la SessionMode enumeración de un contrato y la ServiceBehaviorAttribute.InstanceContextMode propiedad , que controla la asociación entre canales y objetos de servicio específicos.
En la tabla siguiente se muestra el resultado de un canal entrante que admite sesiones confiables o no admite sesiones confiables dada la combinación de valores de la ServiceContractAttribute.SessionMode propiedad y la ServiceBehaviorAttribute.InstanceContextMode propiedad de un servicio.
Valor InstanceContextMode | Requerido | Permitida | No permitidos |
---|---|---|---|
PerCall | - Comportamiento con canal con sesión: una sesión y System.ServiceModel.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 System.ServiceModel.InstanceContext para cada llamada. - Comportamiento con canal sin sesión: un System.ServiceModel.InstanceContext para cada llamada. |
- Comportamiento con canal con sesión: se produce una excepción. - Comportamiento con canal sin sesión: un System.ServiceModel.InstanceContext para cada llamada. |
PerSession | - Comportamiento con canal con sesión: una sesión y System.ServiceModel.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 System.ServiceModel.InstanceContext para cada canal. - Comportamiento con canal sin sesión: un System.ServiceModel.InstanceContext para cada llamada. |
- Comportamiento con canal con sesión: se produce una excepción. - Comportamiento con canal sin sesión: un System.ServiceModel.InstanceContext para cada llamada. |
Single | - Comportamiento con canal con sesión: una sesión y otra System.ServiceModel.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 System.ServiceModel.InstanceContext para cada singleton creado o para el singleton especificado por el usuario. - Comportamiento con canal sin sesión: para System.ServiceModel.InstanceContext cada singleton creado o para el singleton especificado por el usuario. |
- Comportamiento con canal con sesión: se produce una excepción. - Comportamiento con canal sin sesión: para System.ServiceModel.InstanceContext cada singleton creado o para el singleton especificado por el usuario. |