Partilhar via


SessionMode Enumeração

Definição

Especifica os valores disponíveis para indicar o suporte às sessões confiáveis que um contrato requer ou dá suporte.

public enum class SessionMode
public enum SessionMode
type SessionMode = 
Public Enum SessionMode
Herança
SessionMode

Campos

Allowed 0

Especifica que o contrato dá suporte a sessões, se a associação de entrada der suporte a elas.

NotAllowed 2

Especifica que o contrato nunca dá suporte a associações que iniciam sessões.

Required 1

Especifica que o contrato exige uma associação de sessão. Uma exceção será lançada se a associação não estiver configurada para dar suporte à sessão.

Exemplos

O exemplo de código a seguir mostra como usar a SessionMode propriedade do contrato de serviço para especificar que o IMyService contrato de serviço requer associações que dão suporte ao estado da ServiceContractAttribute sessão.

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

Comentários

Use a SessionMode enumeração com a ServiceContractAttribute.SessionMode propriedade para exigir, permitir ou proibir associações para usar sessões entre pontos de extremidade que se conectam ou dão suporte ao contrato de serviço. Uma sessão é uma forma de correlacionar um conjunto de mensagens trocadas entre dois ou mais pontos de extremidade. Para obter mais informações sobre sessões, consulte Como usar sessões.

Se o serviço der suporte a sessões, você poderá usar a ServiceBehaviorAttribute.InstanceContextMode propriedade para especificar a relação entre as instâncias da implementação do contrato de serviço e a sessão de canal.

Por exemplo, se a ServiceContractAttribute.SessionMode propriedade estiver definida Allowed como e a ServiceBehaviorAttribute.InstanceContextMode propriedade estiver definida como InstanceContextMode.PerSession, um cliente poderá usar uma associação que dá suporte a sessões confiáveis para fazer chamadas repetidas para o mesmo objeto de serviço.

Como uma sessão é um conceito de nível de canal que o modelo de aplicativo usa, há uma interação entre a SessionMode enumeração em um contrato e a ServiceBehaviorAttribute.InstanceContextMode propriedade, que controla a associação entre canais e objetos de serviço específicos.

A tabela a seguir mostra o resultado de um canal de entrada que dá suporte a sessões confiáveis ou não dá suporte a sessões confiáveis, dada a combinação de um serviço dos valores da ServiceContractAttribute.SessionMode propriedade e da ServiceBehaviorAttribute.InstanceContextMode propriedade.

Valor InstanceContextMode Obrigatório Permitido NotAllowed
Percall – Comportamento com canal com sessão: uma sessão e System.ServiceModel.InstanceContext para cada chamada.
– Comportamento com canal sem sessão: uma exceção é gerada.
– Comportamento com canal com sessão: uma sessão e System.ServiceModel.InstanceContext para cada chamada.
– Comportamento com canal sem sessão: um System.ServiceModel.InstanceContext para cada chamada.
– Comportamento com canal com sessão: uma exceção é gerada.
– Comportamento com canal sem sessão: um System.ServiceModel.InstanceContext para cada chamada.
Persession – Comportamento com canal com sessão: uma sessão e System.ServiceModel.InstanceContext para cada canal.
– Comportamento com canal sem sessão: uma exceção é gerada.
– Comportamento com canal com sessão: uma sessão e System.ServiceModel.InstanceContext para cada canal.
– Comportamento com canal sem sessão: um System.ServiceModel.InstanceContext para cada chamada.
– Comportamento com canal com sessão: uma exceção é gerada.
– Comportamento com canal sem sessão: um System.ServiceModel.InstanceContext para cada chamada.
Single – Comportamento com canal com sessão: uma sessão e outra System.ServiceModel.InstanceContext para todas as chamadas.
– Comportamento com canal sem sessão: uma exceção é gerada.
- Comportamento com canal com sessão: uma sessão e System.ServiceModel.InstanceContext para cada singleton criado ou para o singleton especificado pelo usuário.
- Comportamento com canal sem sessão: um System.ServiceModel.InstanceContext para cada singleton criado ou para o singleton especificado pelo usuário.
– Comportamento com canal com sessão: uma exceção é gerada.
- Comportamento com canal sem sessão: um System.ServiceModel.InstanceContext para cada singleton criado ou para o singleton especificado pelo usuário.

Aplica-se a