セッションの使用Using Sessions

Windows Communication Foundation (WCF) アプリケーションでは、セッションによってメッセージのグループがメッセージ交換に関連付けられます。In Windows Communication Foundation (WCF) applications, a session correlates a group of messages into a conversation. WCF セッションは、ASP.NET アプリケーションで使用できるセッションオブジェクトとは異なり、さまざまな動作をサポートし、さまざまな方法で制御できます。WCF sessions are different than the session object available in ASP.NET applications, support different behaviors, and are controlled in different ways. このトピックでは、WCF アプリケーションでセッションが有効にする機能とその使用方法について説明します。This topic describes the features that sessions enable in WCF applications and how to use them.

Windows Communication Foundation アプリケーションのセッションSessions in Windows Communication Foundation Applications

サービス コントラクトでセッションが必要であると指定されている場合、すべての呼び出し (つまり、呼び出しをサポートする基本的なメッセージ交換) を同じメッセージ交換の一部にする必要があります。When a service contract specifies that it requires a session, that contract is specifying that all calls (that is, the underlying message exchanges that support the calls) must be part of the same conversation. セッションが許可されるが必須ではないコントラクトの場合、クライアントは、接続した後にセッションを確立できます。また、セッションを確立しないままにしておくこともできます。If a contract specifies that it allows sessions but does not require one, clients can connect and either establish a session or not establish a session. セッションが終了したのに、同じチャネルでメッセージが送信されると、例外がスローされます。If the session ends and a message is sent through the same channel an exception is thrown.

WCF セッションには、次の主要な概念機能があります。WCF sessions have the following main conceptual features:

  • 呼び出し側アプリケーション (WCF クライアント) によって明示的に開始および終了される。They are explicitly initiated and terminated by the calling application (the WCF client).

  • セッション中に配信されたメッセージは、受信された順に処理される。Messages delivered during a session are processed in the order in which they are received.

  • セッションはメッセージのグループを相互に関連付けて通信を行う。Sessions correlate a group of messages into a conversation. 関連付けにはさまざまな種類があります。Different types of correlation are possible. たとえば、あるセッション ベースのチャネルでは、共有ネットワーク接続に基づいてメッセージが相互に関連付けられる一方、別のセッション ベースのチャネルでは、メッセージ本文にある共有タグに基づいてメッセージが相互に関連付けられます。For instance, one session-based channel may correlate messages based on a shared network connection while another session-based channel may correlate messages based on a shared tag in the message body. セッションから派生可能な機能は、相互関連付けの性質によって異なります。The features that can be derived from the session depend on the nature of the correlation.

  • WCF セッションに関連付けられている一般的なデータストアはありません。There is no general data store associated with a WCF session.

ASP.NET アプリケーションの @no__t 0 クラスと、それによって提供される機能に慣れている場合は、そのようなセッションと WCF セッションの間に次の違いがあることがわかります。If you are familiar with the System.Web.SessionState.HttpSessionState class in ASP.NET applications and the functionality it provides, you might notice the following differences between that kind of session and WCF sessions:

  • ASP.NET セッションは常にサーバーによって開始されます。ASP.NET sessions are always server-initiated.

  • ASP.NET セッションは暗黙的に順序付けされていません。ASP.NET sessions are implicitly unordered.

  • ASP.NET セッションでは、複数の要求にわたって一般的なデータストレージメカニズムが提供します。ASP.NET sessions provide a general data storage mechanism across requests.

このトピックでは、次の項目について説明します。This topic describes:

  • サービス モデル レイヤーにおいてセッション ベースのバインディングを使用する場合の既定の実行動作。The default execution behavior when using session-based bindings in the service model layer.

  • WCF セッションベースのシステム指定のバインディングによって提供される機能の種類。The types of features that the WCF session-based, system-provided bindings provide.

  • セッションの要件を宣言するコントラクトの作成方法。How to create a contract that declares a session requirement.

  • セッションの作成と終了、およびセッションとサービス インスタンスの関係を理解し、制御する方法。How to understand and control the creation and termination of the session and the relationship of the session to the service instance.

セッションを使用した既定の実行動作Default Execution Behavior Using Sessions

セッションの開始を試みるバインディングは、 セッション ベース のバインディングと呼ばれます。A binding that attempts to initiate a session is called a session-based binding. サービス コントラクトで、セッション ベースのバインディングを要求、許可、または拒否するように指定するときは、サービス コントラクト インターフェイス (またはクラス) の ServiceContractAttribute.SessionMode プロパティを System.ServiceModel.SessionMode 列挙値に設定します。Service contracts specify that they require, permit, or refuse session-based bindings by setting the ServiceContractAttribute.SessionMode property on the service contract interface (or class) to one of the System.ServiceModel.SessionMode enumeration values. 既定では、このプロパティの値は0に設定さ @no__t れています。つまり、クライアントが WCF サービス実装でセッションベースのバインディングを使用する場合、サービスは提供されたセッションを確立して使用します。By default, the value of this property is Allowed, which means that if a client uses a session-based binding with a WCF service implementation, the service establishes and uses the session provided.

WCF サービスがクライアントセッションを受け入れると、既定では次の機能が有効になります。When a WCF service accepts a client session, the following features are enabled by default:

  1. WCF クライアントオブジェクト間のすべての呼び出しは、同じサービスインスタンスによって処理されます。All calls between a WCF client object are handled by the same service instance.

  2. さまざまなセッション ベースのバインディングによって追加機能が提供されます。Different session-based bindings provide additional features.

システム指定のセッションの種類System-Provided Session Types

セッション ベースのバインディングは、サービス インスタンスと特定のセッションとの既定の関連付けをサポートします。A session-based binding supports the default association of a service instance with a particular session. ただし、前のセッション ベースのインスタンス化制御を有効にすることに加えて、セッション ベースのバインディングごとにサポートされる機能も異なります。However, different session-based bindings support different features in addition to enabling the session-based instancing control previously described.

WCF には、次の種類のセッションベースのアプリケーション動作が用意されています。WCF provides the following types of session-based application behavior:

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

セッションを必要とするコントラクトの作成Creating a Contract That Requires a Session

セッションを必要とするコントラクトを作成するのは、サービス コントラクトで宣言する操作のグループをすべて同じセッション内で実行し、メッセージを順番に配信する必要がある場合です。Creating a contract that requires a session states that the group of operations that the service contract declares must all be executed within the same session and that messages must be delivered in order. サービス コントラクトが必要とするセッションのサポート レベルをアサートするには、サービス コントラクト インターフェイスまたはクラスの ServiceContractAttribute.SessionMode プロパティを System.ServiceModel.SessionMode 列挙値に設定して以下を指定します。To assert the level of session support that a service contract requires, set the ServiceContractAttribute.SessionMode property on your service contract interface or class to the value of the System.ServiceModel.SessionMode enumeration to specify whether the contract:

  • コントラクトがセッションを必要とするかどうか。Requires a session.

  • コントラクトで、クライアントによるセッションの確立を許可するかどうか。Allows a client to establish a session.

  • コントラクトでセッションを禁止するかどうか。Prohibits a session.

ただし、 SessionMode プロパティを設定しても、コントラクトが必要とするセッション ベースの動作の種類は指定されません。Setting the SessionMode property does not, however, specify the type of session-based behavior the contract requires. このメソッドは、サービスの構成済みバインディング (通信チャネルを作成する) がサービスの実装時にセッションを確立するかどうかを確認するように WCF に指示します。It instructs WCF to confirm at runtime that the configured binding (which creates the communication channel) for the service does, does not, or can establish a session when implementing a service. ここでもバインディングは、選択する任意の種類のセッション ベースの動作 (セキュリティ セッション、トランスポート セッション、信頼できるセッション、またはこれらの一定の組み合わせ) によってこの要件を満たすことができます。Again, the binding can satisfy that requirement with any type of session-based behavior it chooses—security, transport, reliable, or some combination. 正確な動作は、選択した System.ServiceModel.SessionMode 値によって決まります。The exact behavior depends on the System.ServiceModel.SessionMode value selected. サービスの構成済みバインディングが SessionModeの値に一致しない場合は、例外がスローされます。If the configured binding of the service does not conform to the value of SessionMode, an exception is thrown. セッションをサポートするバインディングと、それが作成するチャネルは、セッション ベースのバインディングまたはチャネルと呼ばれます。Bindings and the channels they create that support sessions are said to be session-based.

次のサービス コントラクトは、 ICalculatorSession のすべての操作をセッション内で交換する必要があることを指定しています。The following service contract specifies that all operations in the ICalculatorSession must be exchanged within a session. Equals メソッドを除き、どの操作も呼び出し元に値を返しません。None of the operations returns a value to the caller except the Equals method. ただし、 Equals メソッドはパラメーターを受け取らないため、データが既に他の操作に渡されているセッション内では、ゼロ以外の値しか返すことができません。However, the Equals method takes no parameters and, therefore, can only return a non-zero value inside a session in which data has already been passed to the other operations. このコントラクトでは、セッションが正常に機能する必要があります。This contract requires a session to function properly. 特定のクライアントに関連付けられているセッションがないと、サービス インスタンスは、そのクライアントが以前に送信したデータを知ることができません。Without a session associated with a specific client, the service instance has no way of knowing what previous data this client has sent.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
    [OperationContract(IsOneWay=true)]
    void Clear();
    [OperationContract(IsOneWay = true)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true)]
    void DivideBy(double n);
    [OperationContract]
    double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession

    <OperationContract(IsOneWay:=True)> _
    Sub Clear()
    <OperationContract(IsOneWay:=True)> _
    Sub AddTo(ByVal n As Double)
    <OperationContract(IsOneWay:=True)> _
    Sub SubtractFrom(ByVal n As Double)
    <OperationContract(IsOneWay:=True)> _
    Sub MultiplyBy(ByVal n As Double)
    <OperationContract(IsOneWay:=True)> _
    Sub DivideBy(ByVal n As Double)
    <OperationContract()> _
    Function Equal() As Double
End Interface

サービスがセッションを許可した場合は、クライアントがセッションを開始するとセッションが確立され、使用されますが、許可しない場合は、セッションが確立されません。If a service allows a session, then a session is established and used if the client initiates one; otherwise, no session is established.

セッションとサービス インスタンスSessions and Service Instances

WCF で既定のインスタンス化動作を使用する場合、WCF クライアントオブジェクト間のすべての呼び出しは、同じサービスインスタンスによって処理されます。If you use the default instancing behavior in WCF, all calls between a WCF client object are handled by the same service instance. そのため、アプリケーション レベルでは、セッションは、ローカル呼び出し動作と同様のアプリケーション動作を有効にすると考えることができます。Therefore, at the application level, you can think of a session as enabling application behavior similar to local call behavior. たとえば、ローカル オブジェクトを作成するときは、次のような流れになります。For example, when you create a local object:

  • コンストラクターが呼び出されます。A constructor is called.

  • WCF クライアントオブジェクト参照に対する後続の呼び出しは、すべて同じオブジェクトインスタンスによって処理されます。All subsequent calls made to the WCF client object reference are processed by the same object instance.

  • オブジェクト参照が破棄されると、デストラクターが呼び出されます。A destructor is called when the object reference is destroyed.

既定のサービス インスタンス動作を使用している限り、セッションでは、クライアントとサービス間で同様の動作が有効になります。Sessions enable a similar behavior between clients and services as long as the default service instance behavior is used. サービス コントラクトがセッションを必要としたり、サポートしたりする場合は、 IsInitiating プロパティと IsTerminating プロパティを設定することで、1 つ以上のコントラクト操作をセッションの開始または終了としてマークできます。If a service contract requires or supports sessions, one or more contract operations can be marked as initiating or terminating a session by setting the IsInitiating and IsTerminating properties.

開始操作 は、新しいセッションの最初の操作として呼び出す必要がある操作です。Initiating operations are those that must be called as the first operation of a new session. 開始操作以外の操作は、少なくとも 1 つの開始操作が呼び出された後にしか呼び出すことはできません。Non-initiating operations can be called only after at least one initiating operation has been called. そのため、サービス インスタンスの開始に適した入力をクライアントから取得するように設計された開始操作を宣言することで、サービスに対する一種のセッション コンストラクターを作成できますYou can therefore create a kind of session constructor for your service by declaring initiating operations designed to take input from clients appropriate to the beginning of the service instance. (ただし、状態はセッションに関連付けられ、サービス オブジェクトに関連付けられません)。(The state is associated with the session, however, and not the service object.)

終了操作は、開始操作とは逆に、既存のセッションの最終メッセージとして呼び出す必要がある操作です。Terminating operations, conversely, are those that must be called as the last message in an existing session. 既定では、WCF は、サービスが関連付けられているセッションが閉じられた後に、サービス オブジェクトとそのコンテキストを再利用します。In the default case, WCF recycles the service object and its context after the session with which the service was associated is closed. そのため、サービス インスタンスの終了に適した関数を実行するように設計された終了操作を宣言することで、一種のデストラクターを作成できます。You can, therefore, create a kind of destructor by declaring terminating operations designed to perform a function appropriate to the end of the service instance.

注意

既定の動作は、ローカルのコンストラクターとデストラクターに似ていますが、あくまで似ているだけです。Although the default behavior bears a resemblance to local constructors and destructors, it is only a resemblance. すべての WCF サービス操作は、開始または終了操作、またはその両方を同時に実行できます。Any WCF service operation can be an initiating or terminating operation, or both at the same time. さらに既定では、開始操作は、任意の順序で何回でも呼び出すことができます。そのため、 System.ServiceModel.InstanceContext オブジェクトを操作することでサービス インスタンスの有効期間を明示的に制御しない限り、セッションが確立されインスタンスに関連付けられた後に、追加セッションは作成されません。In addition, in the default case, initiating operations can be called any number of times in any order; no additional sessions are created once the session is established and associated with an instance unless you explicitly control the lifetime of the service instance (by manipulating the System.ServiceModel.InstanceContext object). また、状態はセッションに関連付けられ、サービス オブジェクトには関連付けられません。Finally, the state is associated with the session and not the service object.

たとえば、前の例で使用されている ICalculatorSession コントラクトでは、WCF クライアントオブジェクトが、その他の操作の前に最初に Clear 操作を呼び出し、この WCF クライアントオブジェクトとのセッションが Equals 操作を呼び出すときに終了する必要があります。For example, the ICalculatorSession contract used in the preceding example requires that the WCF client object first call the Clear operation prior to any other operation and that the session with this WCF client object should terminate when it calls the Equals operation. 次のコード例は、この要件を強制的に適用するコントラクトを示しています。The following code example shows a contract that enforces these requirements. セッションを開始するにはまずClear を呼び出す必要があります。 Equals を呼び出すとセッションが終了します。Clear must be called first to initiate a session, and that session ends when Equals is called.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
    [OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
    void Clear();
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void DivideBy(double n);
    [OperationContract(IsInitiating = false, IsTerminating = true)]
    double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession

    <OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
    Sub Clear()
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub AddTo(ByVal n As Double)
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub SubtractFrom(ByVal n As Double)
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub MultiplyBy(ByVal n As Double)
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub DivideBy(ByVal n As Double)
    <OperationContract(IsInitiating:=False, IsTerminating:=True)> _
    Function Equal() As Double
End Interface

サービスは、クライアントとのセッションを開始しません。Services do not start sessions with clients. WCF クライアントアプリケーションでは、セッションベースのチャネルの有効期間とセッション自体の有効期間の間に直接的な関係が存在します。In WCF client applications, a direct relationship exists between the lifetime of the session-based channel and the lifetime of the session itself. そのため、クライアントは、新しいセッション ベースのチャネルを作成することによって新しいセッションを作成し、セッション ベースのチャネルを正常に閉じることによって、既存のセッションを破棄します。As such, clients create new sessions by creating new session-based channels and tear down existing sessions by closing session-based channels gracefully. クライアントは、次のいずれかを呼び出してサービス エンドポイントとのセッションを開始します。A client starts a session with a service endpoint by calling one of the following:

通常は、クライアントが次のいずれかを呼び出して、サービス エンドポイントとのセッションを終了します。Typically a client ends a session with a service endpoint by calling one of the following:

  • ICommunicationObject.Close の呼び出しによって返されるチャネルの ChannelFactory<TChannel>.CreateChannelICommunicationObject.Close on the channel returned by a call to ChannelFactory<TChannel>.CreateChannel.

  • Svcutil.exe によって生成される WCF クライアントオブジェクトの ClientBase<TChannel>.CloseClientBase<TChannel>.Close on the WCF client object generated by Svcutil.exe.

  • どちらの種類の WCF クライアントオブジェクトに対しても終了操作 (既定では、操作は終了しません。コントラクトは、終了操作を明示的に指定する必要があります)。A terminating operation on either type of WCF client object (by default, no operations are terminating; the contract must explicitly specify a terminating operation). 最初の操作が呼び出されると、WCF クライアントオブジェクトは自動的にチャネルを開き、セッションを開始します。When the first operation is called, the WCF client object automatically opens the channel and initiates a session.

例については、「 方法: セッションを必要とするサービスを作成する 」、および「 既定のサービスの動作 」と「 インスタンス化 」のサンプルをご覧ください。For examples, see How to: Create a Service That Requires Sessions as well as the Default Service Behavior and Instancing samples.

クライアントとセッションの詳細については、「 WCF クライアントを使用したサービスへのアクセス」を参照してください。For more information about clients and sessions, see Accessing Services Using a WCF Client.

InstanceContext 設定と対話するセッションSessions Interact with InstanceContext Settings

コントラクト内の SessionMode 列挙と、チャネルと特定のサービス オブジェクト間の関連付けを制御する ServiceBehaviorAttribute.InstanceContextMode プロパティの間には相互作用があります。There is an interaction between the SessionMode enumeration in a contract and the ServiceBehaviorAttribute.InstanceContextMode property, which controls the association between channels and specific service objects. 詳細については、「セッション、インスタンス化、および同時実行」を参照してください。For more information, see Sessions, Instancing, and Concurrency.

InstanceContext オブジェクトの共有Sharing InstanceContext Objects

ユーザーが自ら関連付けを行うことにより、どの InstanceContext オブジェクトに、どのセッション ベースのチャネルまたは呼び出しを関連付けるかを制御することもできます。You can also control which session-based channel or call is associated with which InstanceContext object by performing that association yourself.

セッションとストリーミングSessions and Streaming

大量のデータを転送する場合、WCF のストリーミング転送モードは、メッセージをメモリ内でバッファー処理して処理する既定の動作に代わるものです。When you have a large amount of data to transfer, the streaming transfer mode in WCF is a feasible alternative to the default behavior of buffering and processing messages in memory in their entirety. セッション ベースのバインディングでストリーミングを呼び出すと、予期しない動作を引き起こすことがあります。You may get unexpected behavior when streaming calls with a session-based binding. すべてのストリーミング呼び出しは単一のチャネル (データグラム チャネル) を通じて行われますが、このチャネルは使用されるバインディングがセッションを使用するように構成されている場合であっても、セッションをサポートしません。All streaming calls are made through a single channel (the datagram channel) that does not support sessions even if the binding being used is configured to use sessions. セッション ベースのバインディングによって複数のクライアントが同一のサービス オブジェクトに対してストリーミング呼び出しを行う場合、このサービス オブジェクトのコンカレンシー モードが単一に設定され、インスタンス コンテキスト モードが PerSession に設定されていると、すべての呼び出しがこのデータグラム チャネルを通過する必要があるため、同時に処理される呼び出しは 1 つに限られることになります。If multiple clients make streaming calls to the same service object over a session-based binding, and the service object's concurrency mode is set to single and its instance context mode is set to PerSession, all calls must go through the datagram channel and so only one call is processed at a time. その後、1つまたは複数のクライアントがタイムアウトする可能性があります。この問題を回避するには、サービスオブジェクトの InstanceContextModePerCall または Concurrency を複数に設定します。One or more clients may then time out. You can work around this issue by either setting the service object's InstanceContextMode to PerCall or Concurrency to multiple.

注意

この場合、利用可能になる "セッション" は 1 つしかないため、MaxConcurrentSessions は効力を失います。MaxConcurrentSessions have no effect in this case because there is only one "session" available.

関連項目See also