SessionMode Enumerazione

Definizione

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

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

Campi

Allowed 0

Specifica che il contratto supporta le sessioni se queste sono supportate dall'associazione in ingresso.

NotAllowed 2

Specifica che il contratto non supporta in alcun caso le associazioni che avviano sessioni.

Required 1

Specifica che il contratto richiede un'associazione con sessione. Se l'associazione è configurata in modo da non supportare le sessioni, viene generata un'eccezione.

Esempio

Nell'esempio di codice seguente viene illustrato come usare la SessionMode proprietà dell'oggetto ServiceContractAttribute per specificare che il contratto di servizio richiede associazioni che supportano lo IMyService 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

Usare l'enumerazione con la SessionMode ServiceContractAttribute.SessionMode proprietà per richiedere, consentire o impedire associazioni di usare sessioni tra endpoint che si connettono o supportano il contratto di servizio. Mediante una sessione è possibile 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 proprietà per specificare la ServiceBehaviorAttribute.InstanceContextMode relazione tra istanze dell'implementazione del contratto di servizio e la sessione del canale.

Ad esempio, se la proprietà è impostata su Allowed e la ServiceContractAttribute.SessionMode ServiceBehaviorAttribute.InstanceContextMode proprietà è impostata su InstanceContextMode.PerSession, un client può usare un'associazione che supporta sessioni affidabili per eseguire 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 in un contratto e la SessionMode ServiceBehaviorAttribute.InstanceContextMode proprietà, che controlla l'associazione tra canali e oggetti di servizio specifici.

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

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

Si applica a