ServiceContractAttribute.SessionMode プロパティ


セッションが許可されるか、許可されないか、または必要であるかを示す値を取得または設定します。Gets or sets whether sessions are allowed, not allowed or required.

 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 は、セッションが許可されるか、許可されないか、または必要であるかを示します。A SessionMode that indicates whether sessions are allowed, not allowed, or required.


値が、SessionMode 値ではありません。The value is not one of the SessionMode values.

次のサービス コントラクトは、SampleDuplexHello サービス実装とメッセージ交換するときに、構成されたバインドでセッションを使用することを要求します。The following service contract requires that configured bindings use sessions when interacting with SampleDuplexHello service implementations.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
    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);

  public class DuplexHello : IDuplexHello

    public DuplexHello()
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());

      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.
      IHelloCallbackContract callerProxy
        = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
      string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
      Console.WriteLine("Sending back: " + 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.
      Dim callerProxy As IHelloCallbackContract = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
            Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
      Console.WriteLine("Sending back: " & response)
    End Sub
  End Class
End Namespace


SessionMode プロパティを使用して、バインドでエンドポイント間のセッションをサポートすることを要求します。Use the SessionMode property to require bindings that support sessions between endpoints. セッションとは、2 つ以上のエンドポイント間で交換される一連のメッセージを相互に関連付ける方法のことです。A session is a way of correlating a set of messages exchanged between two or more endpoints. サービスがチャネル セッションをサポートする場合は、InstanceContextMode プロパティを使用して、サービス コントラクトが実装するインスタンスとチャネルセッションの関係を指定できます。If your service supports channel sessions, you can then use the InstanceContextMode property to specify the relationship between instances your service contract implementation and the channel session. バインドがセッションをサポートしない場合は、例外がスローされます。If a binding does not support sessions, an exception is thrown.

たとえば、SessionMode プロパティを SessionMode.RequiredInstanceContextMode プロパティを PerSession に設定した場合、クライアントは、同じ接続を使用して同じサービス オブジェクトを繰り返し呼び出すことができます。For example, if the SessionMode property is set to SessionMode.Required and the InstanceContextMode property is set to PerSession, clients can use the same connection to make repeated calls to the same service object.

セッションとサービスインスタンスの詳細については、「セッションとセッション、インスタンス化、および同時実行使用」を参照してください。For more information about sessions and service instances, see Using Sessions and Sessions, Instancing, and Concurrency.


セッションをサポートするチャネルは、特定のセッションとのサービス インスタンスの既定の関連付けをサポートします。A channel that supports sessions supports the default association of a service instance with a particular session. ただし、セッションの実装が異なれば、セッション ベースのインスタンス作成の制御に加えてサポートされる機能も異なります。However, different session implementations support different features in addition to session-based instancing control. WCF には、セッションフルアプリケーションの動作を提供するために使用できる4種類のセッションが用意されています。セッションの種類ごとに、セッションの種類に固有の追加の動作が提供されます。WCF provides four types of sessions that you can use to provide sessionful application behavior; each type of session provides additional behavior specific to the type of session it is.

  1. System.ServiceModel.Channels.SecurityBindingElement は セキュリティ セッションをサポートします。このセッションでは、通信の両側が暗号化またはデジタル署名、あるいはその両方の処理を行うことに合意し、すべてのメッセージはセキュリティで保護されたメッセージ交換に関連付けられます。The System.ServiceModel.Channels.SecurityBindingElement supports security sessions, in which both ends of communication have agreed upon an encryption and/or digital signature process; all messages are correlated with that specific secure conversation. 詳細については、「サービスのセキュリティ保護」を参照してください。For more information, see Securing Services. たとえば、セキュリティ セッションと信頼できるセッションの両方のサポートを含む System.ServiceModel.WSHttpBinding は、既定では、メッセージを暗号化してデジタル署名を行うセキュリティで保護されたセッションのみを使用します。For example, the System.ServiceModel.WSHttpBinding, which contains support for both security sessions and reliable sessions, by default uses only a secure session which encrypts and digitally signs messages.

  2. System.ServiceModel.NetTcpBinding は、TCP/IP 接続によって公開されるセッションをサポートし、接続セッションにより、すべてのメッセージがソケット レベルで関連付けられるようにします。The System.ServiceModel.NetTcpBinding supports the sessions exposed by the TCP/IP connections to ensure that all messages are correlated by the connection session at the socket level.

  3. WS-ReliableMessaging 仕様を実装する System.ServiceModel.Channels.ReliableSessionBindingElement は、メッセージが順に 1 回だけ配信される、信頼できるセッションをサポートしているため、メッセージがその交換時に複数のノードを通過するときでも信頼性を実現します。The System.ServiceModel.Channels.ReliableSessionBindingElement, which implements the WS-ReliableMessaging specification, provides support for reliable sessions in which messages are delivered in order and exactly once, enabling confidence even when messages travel across multiple nodes during the conversation. 詳細については、「信頼できるセッション」を参照してください。For more information, see Reliable Sessions.

  4. System.ServiceModel.NetMsmqBinding は、MSMQ データグラム セッションを提供します。The System.ServiceModel.NetMsmqBinding provides MSMQ datagram sessions. 詳細については、「 WCF のキュー」を参照してください。For more information, see Queues in WCF.

SessionMode プロパティを設定すると、コントラクトが必要とするセッションの種類は指定されず、コントラクトがセッションを必要とすることだけが指定されることに注意してください。Remember that setting the SessionMode property does not specify the type of session the contract requires, only that it requires one.