ServiceContractAttribute.SessionMode 属性

定义

获取或设置是否允许、不允许或要求会话。

public:
 property System::ServiceModel::SessionMode SessionMode { System::ServiceModel::SessionMode get(); void set(System::ServiceModel::SessionMode value); };
public System.ServiceModel.SessionMode SessionMode { get; set; }
member this.SessionMode : System.ServiceModel.SessionMode with get, set
Public Property SessionMode As SessionMode

属性值

SessionMode

指示是否允许、不允许或要求会话的 SessionMode

例外

该值不是 SessionMode 值之一。

示例

以下服务协定要求配置绑定在与 SampleDuplexHello 服务实现交互时使用会话。

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 需要支持终结点之间的会话的绑定。 会话就是将在两个或多个终结点之间交换的消息集相互关联的方式。 如果服务支持通道会话,则可以使用该 InstanceContextMode 属性指定服务协定实现与通道会话之间的实例之间的关系。 如果绑定不支持会话,则会引发异常。

例如,如果属性 SessionMode 设置为 SessionMode.Required 该属性且 InstanceContextMode 属性设置为 PerSession该属性,则客户端可以使用同一连接对同一服务对象进行重复调用。

有关会话和服务实例的详细信息,请参阅 使用会话会话、实例和并发

备注

支持会话的信道支持服务实例与特定会话的默认关联。 但是,除了基于会话的实例化控件外,不同的会话实现支持不同的功能。 WCF 提供四种类型的会话,可用于提供会话应用程序行为;每种类型的会话都提供特定于会话类型的其他行为。

  1. 支持 System.ServiceModel.Channels.SecurityBindingElement 安全会话,其中通信的两端都同意加密和/或数字签名过程;所有消息都与该特定安全对话相关联。 有关详细信息,请参阅保护服务。 例如, System.ServiceModel.WSHttpBinding它包含对安全会话和可靠会话的支持,默认情况下仅使用加密和数字签名消息的安全会话。

  2. 支持 System.ServiceModel.NetTcpBinding TCP/IP 连接公开的会话,以确保所有消息都与套接字级别的连接会话关联。

  3. System.ServiceModel.Channels.ReliableSessionBindingElement规范实现了WS-ReliableMessaging规范,它为可靠会话提供支持,使消息在会话期间跨多个节点传输时也能保持置信度。 有关详细信息,请参阅 可靠会话

  4. 提供 System.ServiceModel.NetMsmqBinding MSMQ 数据报会话。 有关详细信息,请参阅 WCF 中的查询

请记住,设置 SessionMode 属性不会指定协定所需的会话类型,而只需要一个会话。

适用于