Compartir vía


SessionMode Enumeración

Definición

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
SessionMode

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.

Se aplica a