SessionMode Enumerazione
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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à
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. |