SessionMode Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Задает значения для указания поддержки для надежных сеансов, которые требует или поддерживает контракт.
public enum class SessionMode
public enum SessionMode
type SessionMode =
Public Enum SessionMode
- Наследование
Поля
Allowed | 0 | Указывает, что контракт поддерживает сеансы, если входящая привязка их поддерживает. |
NotAllowed | 2 | Указывает, что контракт не поддерживает привязки, инициирующие сеансы. |
Required | 1 | Указывает, что для контракта требует привязка, связанная с сеансом. Если привязка не настроена для поддержки сеанса, выдается исключение. |
Примеры
В следующем примере кода показано, как использовать SessionMode свойство ServiceContractAttribute для указания того, что IMyService
контракту службы требуются привязки, поддерживающие состояние сеанса.
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
Комментарии
Используйте перечисление SessionMode со свойством ServiceContractAttribute.SessionMode , чтобы требовать, разрешать или запрещать привязки использовать сеансы между конечными точками, которые подключаются к контракту службы или поддерживают его. Сеанс — это способ корреляции набора сообщений, обмен которыми выполняется между двумя или несколькими конечными точками. Дополнительные сведения о сеансах см. в разделе "Использование сеансов".
Если служба поддерживает сеансы, можно использовать ServiceBehaviorAttribute.InstanceContextMode свойство, чтобы указать связь между экземплярами реализации контракта службы и сеансом канала.
Например, если ServiceContractAttribute.SessionMode для свойства задано Allowed
значение и ServiceBehaviorAttribute.InstanceContextMode свойство задано InstanceContextMode.PerSession, клиент может использовать привязку, которая поддерживает надежные сеансы для выполнения повторяющихся вызовов к одному объекту службы.
Поскольку сеанс представляет собой концепцию уровня канала, которую использует модель приложения, существует взаимодействие между SessionMode перечислением в контракте и ServiceBehaviorAttribute.InstanceContextMode свойством, которое управляет связью между каналами и конкретными объектами службы.
В следующей таблице показан результат входящего канала либо поддержки надежных сеансов, либо не поддерживает надежные сеансы с учетом сочетания значений ServiceContractAttribute.SessionMode свойства и ServiceBehaviorAttribute.InstanceContextMode свойства.
Значение InstanceContextMode | Обязательно | Допускается | NotAllowed |
---|---|---|---|
PerCall | — Поведение с сеансным каналом: сеанс и System.ServiceModel.InstanceContext для каждого вызова. — Поведение с каналом без сеансов: возникает исключение. |
— Поведение с сеансным каналом: сеанс и System.ServiceModel.InstanceContext для каждого вызова. — Поведение с каналом без сеансов: System.ServiceModel.InstanceContext для каждого вызова. |
— Поведение с сеансовым каналом: возникает исключение. — Поведение с каналом без сеансов: System.ServiceModel.InstanceContext для каждого вызова. |
PerSession | — Поведение с сеансным каналом: сеанс и System.ServiceModel.InstanceContext для каждого канала. — Поведение с каналом без сеансов: возникает исключение. |
— Поведение с сеансным каналом: сеанс и System.ServiceModel.InstanceContext для каждого канала. — Поведение с каналом без сеансов: System.ServiceModel.InstanceContext для каждого вызова. |
— Поведение с сеансовым каналом: возникает исключение. — Поведение с каналом без сеансов: System.ServiceModel.InstanceContext для каждого вызова. |
Single | — Поведение с сеансным каналом: один сеанс и один System.ServiceModel.InstanceContext для всех вызовов. — Поведение с каналом без сеансов: возникает исключение. |
— Поведение с сеансным каналом: сеанс и System.ServiceModel.InstanceContext для каждого созданного одноэлемента или для указанного пользователем одноэлемента. — Поведение с каналом без сеансов: System.ServiceModel.InstanceContext для каждого созданного одноэлемента или для указанного пользователем одноэлемента. |
— Поведение с сеансовым каналом: возникает исключение. — Поведение с каналом без сеансов: System.ServiceModel.InstanceContext для каждого созданного одноэлемента или для указанного пользователем одноэлемента. |