SessionMode 枚举

定义

指定可用于指示支持协定需要或支持的可靠会话的值。

public enum class SessionMode
public enum SessionMode
type SessionMode = 
Public Enum SessionMode
继承
SessionMode

字段

Allowed 0

指定当传入绑定支持会话时,协定也支持会话。

NotAllowed 2

指定协定永不支持启动会话的绑定。

Required 1

指定协定需要会话绑定。 如果绑定并未配置为支持会话,则将引发异常。

示例

下面的代码示例演示如何使用 SessionMode 服务协定的属性 ServiceContractAttributeIMyService 指定服务协定需要支持会话状态的绑定。

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属性,则客户端可以使用支持可靠会话的绑定对同一服务对象进行重复调用。

由于会话是应用程序模型使用的通道级概念,因此协定中的枚举与ServiceBehaviorAttribute.InstanceContextMode属性之间存在SessionMode交互,用于控制通道与特定服务对象的关联。

下表显示了传入通道的结果:支持可靠会话,或者不支持可靠会话,因为服务将属性和ServiceBehaviorAttribute.InstanceContextMode属性的值ServiceContractAttribute.SessionMode组合在一起。

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 每个创建的单一实例或用户指定的单一实例的行为。

适用于