Condividi tramite


SessionMode Enumerazione

Definizione

Specifica i valori disponibili per indicare il supporto per sessioni affidabili richieste o supportate da un contratto.

public enum class SessionMode
public enum SessionMode
type SessionMode = 
Public Enum SessionMode
Ereditarietà
SessionMode

Campi

Nome Valore Descrizione
Allowed 0

Specifica che il contratto supporta le sessioni se l'associazione in ingresso le supporta.

Required 1

Specifica che il contratto richiede un'associazione con sessione. Viene generata un'eccezione se l'associazione non è configurata per supportare la sessione.

NotAllowed 2

Specifica che il contratto non supporta mai le associazioni che avviano sessioni.

Esempio

Nell'esempio di codice seguente viene illustrato come utilizzare la SessionMode proprietà di ServiceContractAttribute per specificare che il IMyService contratto di servizio richiede associazioni che supportano lo stato della sessione.

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

Commenti

Utilizzare l'enumerazione SessionMode con la ServiceContractAttribute.SessionMode proprietà per richiedere, consentire o impedire associazioni di usare sessioni tra endpoint che si connettono o supportano il contratto di servizio. Una sessione è un modo per correlare un set di messaggi scambiati tra due o più endpoint. Per altre informazioni sulle sessioni, vedere Uso di sessioni.

Se il servizio supporta le sessioni, è possibile usare la ServiceBehaviorAttribute.InstanceContextMode proprietà per specificare la relazione tra istanze dell'implementazione del contratto di servizio e la sessione del canale.

Ad esempio, se la ServiceContractAttribute.SessionMode proprietà è impostata su Allowed e la ServiceBehaviorAttribute.InstanceContextMode proprietà è impostata su InstanceContextMode.PerSession, un client può utilizzare un'associazione che supporta sessioni affidabili per effettuare chiamate ripetute allo stesso oggetto servizio.

Poiché una sessione è un concetto a livello di canale usato dal modello di applicazione, esiste un'interazione tra l'enumerazione SessionMode in un contratto e la ServiceBehaviorAttribute.InstanceContextMode proprietà , che controlla l'associazione tra canali e oggetti servizio specifici.

Nella tabella seguente viene illustrato il risultato di un canale in ingresso che supporta sessioni affidabili o che non supportano sessioni affidabili in base alla combinazione dei valori della ServiceContractAttribute.SessionMode proprietà e della ServiceBehaviorAttribute.InstanceContextMode proprietà di un servizio.

Valore InstanceContextMode Obbligatorio Consentito NonConsentito
PerCall - Comportamento con canale con sessione: una sessione e System.ServiceModel.InstanceContext per ogni chiamata.
- Comportamento con canale senza sessione: viene sollevata un'eccezione.
- Comportamento con canale con sessione: una sessione e System.ServiceModel.InstanceContext per ogni chiamata.
- Comportamento con canale senza sessione: un System.ServiceModel.InstanceContext per ogni chiamata.
- Comportamento con canale con sessione: viene generata un'eccezione.
- Comportamento con canale senza sessione: un System.ServiceModel.InstanceContext per ogni chiamata.
PerSession - Comportamento con canale con sessione: una sessione e System.ServiceModel.InstanceContext per ogni canale.
- Comportamento con canale senza sessione: viene sollevata un'eccezione.
- Comportamento con canale con sessione: una sessione e System.ServiceModel.InstanceContext per ogni canale.
- Comportamento con canale senza sessione: un System.ServiceModel.InstanceContext per ogni chiamata.
- Comportamento con canale con sessione: viene generata un'eccezione.
- Comportamento con canale senza sessione: un System.ServiceModel.InstanceContext per ogni chiamata.
Single - Comportamento con canale con sessione: una sessione e una System.ServiceModel.InstanceContext per tutte le chiamate.
- Comportamento con canale senza sessione: viene sollevata un'eccezione.
- Comportamento con canale con sessione: una sessione e System.ServiceModel.InstanceContext per ogni singleton creato o per il singleton specificato dall'utente.
- Comportamento con canale senza sessione: oggetto System.ServiceModel.InstanceContext per ogni singleton creato o per il singleton specificato dall'utente.
- Comportamento con canale con sessione: viene generata un'eccezione.
- Comportamento con canale senza sessione: oggetto System.ServiceModel.InstanceContext per ogni singleton creato o per il singleton specificato dall'utente.

Si applica a