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 値ではありません。

次のサービス コントラクトでは、構成されたバインディングがサービス実装と 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 サポートするバインドを要求するには、 プロパティを使用します。 セッションとは、2 つ以上のエンドポイント間で交換される一連のメッセージを相互に関連付ける方法のことです。 サービスでチャネル セッションがサポートされている場合は、 プロパティを InstanceContextMode 使用して、サービス コントラクトの実装とチャネル セッションのインスタンス間のリレーションシップを指定できます。 バインドがセッションをサポートしない場合は、例外がスローされます。

たとえば、 プロパティが SessionModeSessionMode.Required 設定されていて、 InstanceContextMode プロパティが に PerSession設定されている場合、クライアントは同じ接続を使用して同じサービス オブジェクトを繰り返し呼び出すことができます。

セッションとサービス インスタンスの詳細については、「セッションとセッションの使用」、「インスタンス化」、「コンカレンシー」を参照してください。

Note

セッションをサポートするチャネルは、特定のセッションとのサービス インスタンスの既定の関連付けをサポートします。 ただし、セッションの実装が異なれば、セッション ベースのインスタンス作成の制御に加えてサポートされる機能も異なります。 WCF には、セッションフル アプリケーションの動作を提供するために使用できる 4 種類のセッションが用意されています。セッションの種類ごとに、セッションの種類に固有の追加の動作が提供されます。

  1. System.ServiceModel.Channels.SecurityBindingElement 、通信の両端が暗号化やデジタル署名プロセスに合意したセキュリティ セッションをサポートします。すべてのメッセージは、その特定のセキュリティで保護された会話と関連付けます。 詳細については、「サービスのセキュリティ保護」を参照してください。 たとえば、 System.ServiceModel.WSHttpBindingセキュリティ セッションと信頼できるセッションの両方のサポートを含む は、既定では、メッセージを暗号化してデジタル署名するセキュリティで保護されたセッションのみを使用します。

  2. では System.ServiceModel.NetTcpBinding 、TCP/IP 接続によって公開されるセッションがサポートされ、すべてのメッセージがソケット レベルの接続セッションによって確実に関連付けられます。

  3. System.ServiceModel.Channels.ReliableSessionBindingElementWS-ReliableMessaging仕様を実装する は、メッセージが順番に 1 回だけ配信される信頼性の高いセッションをサポートし、メッセージが会話中に複数のノード間を移動した場合でも信頼できるようにします。 詳細については、「信頼できるセッション」を参照してください。

  4. System.ServiceModel.NetMsmqBinding 、MSMQ データグラム セッションを提供します。 詳細については、WCF のキューに関するページを参照してください。

プロパティを SessionMode 設定しても、コントラクトに必要なセッションの種類は指定されず、必要なものだけが指定されることに注意してください。

適用対象