セッション、インスタンス化、およびコンカレンシーSessions, Instancing, and Concurrency

"セッション" とは、2 つのエンドポイント間で送信されるすべてのメッセージを相互に関連付けたものです。A session is a correlation of all messages sent between two endpoints. "インスタンス化" とは、ユーザー定義のサービス オブジェクトとこれらのオブジェクトに関連する InstanceContext オブジェクトの有効期間を制御することです。Instancing refers to controlling the lifetime of user-defined service objects and their related InstanceContext objects. また、コンカレンシーは、InstanceContext で同時に実行されるスレッドの数の制御を表す用語です。Concurrency is the term given to the control of the number of threads executing in an InstanceContext at the same time.

ここでは、これらの設定とその使用方法、各設定間のさまざまな相互作用について説明します。This topic describes these settings, how to use them, and the various interactions between them.

セッションSessions

サービス コントラクトによって ServiceContractAttribute.SessionMode プロパティが SessionMode.Requiredに設定されている場合、すべての呼び出し (つまり、呼び出しをサポートする、基になるメッセージ交換) を同じメッセージ交換の一部にする必要があります。When a service contract sets the ServiceContractAttribute.SessionMode property to SessionMode.Required, that contract is saying 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. セッションが終了したのに、同じセッション ベースのチャネルでメッセージが送信されると、例外がスローされます。If the session ends and a message is sent over the same session-based channel an exception is thrown.

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

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

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

  • セッションはメッセージのグループを相互に関連付けて通信を行う。Sessions correlate a group of messages into a conversation. ここで "相互に関連付ける" は、抽象的な意味を持ちます。The meaning of that correlation is an abstraction. たとえば、あるセッション ベースのチャネルでは、共有ネットワーク接続に基づいてメッセージが相互に関連付けられる一方、別のセッション ベースのチャネルでは、メッセージ本文にある共有タグに基づいてメッセージが相互に関連付けられます。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 アプリケーションのSystem.Web.SessionState.HttpSessionStateクラスと、そのクラスによって提供される機能に精通している場合は、そのようなセッションと 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.

クライアント アプリケーションとサービス アプリケーションでは、異なる方法でセッションと対話します。Client applications and service applications interact with sessions in different ways. クライアント アプリケーションはセッションを開始し、セッション内で送信されてきたメッセージの受信と処理を行います。Client applications initiate sessions and then receive and process the messages sent within the session. サービス アプリケーションでは、動作を追加するための機能拡張ポイントとしてセッションを使用できます。Service applications can use sessions as an extensibility point to add additional behavior. これは InstanceContext を直接操作する、またはカスタムのインスタンス コンテキスト プロバイダーを実装することで可能になります。This is done by working directly with the InstanceContext or implementing a custom instance context provider.

"インスタンス化"Instancing

インスタンス化動作 ( ServiceBehaviorAttribute.InstanceContextMode プロパティを使用して設定します) は、受信メッセージに応答して InstanceContext を作成する方法を制御します。The instancing behavior (set by using the ServiceBehaviorAttribute.InstanceContextMode property) controls how the InstanceContext is created in response to incoming messages. 既定では、各 InstanceContext は 1 つのユーザー定義サービス オブジェクトに関連付けられています。したがって、(既定では) InstanceContextMode プロパティを設定することによってもユーザー定義サービス オブジェクトのインスタンス化を制御できます。By default, each InstanceContext is associated with one user-defined service object, so (in the default case) setting the InstanceContextMode property also controls the instancing of user-defined service objects. インスタンス化モードは InstanceContextMode 列挙体によって定義されます。The InstanceContextMode enumeration defines the instancing modes.

次のインスタンス化モードを使用できます。The following instancing modes are available:

  • PerCall:クライアント要求InstanceContextごとに新しい (およびサービスオブジェクト) が作成されます。PerCall: A new InstanceContext (and therefore service object) is created for each client request.

  • PerSession:InstanceContext新しい (およびサービスオブジェクト) が新しいクライアントセッションごとに作成され、そのセッションの有効期間にわたって保持されます (これには、セッションをサポートするバインディングが必要です)。PerSession: A new InstanceContext (and therefore service object) is created for each new client session and maintained for the lifetime of that session (this requires a binding that supports sessions).

  • Single:アプリケーションのInstanceContext有効期間中は、単一の (およびサービスオブジェクト) によってすべてのクライアント要求が処理されます。Single: A single InstanceContext (and therefore service object) handles all client requests for the lifetime of the application.

既定の InstanceContextMode 値 (サービス クラスで明示的に設定された PerSession ) を次のコード例に示します。The following code example shows the default InstanceContextMode value, PerSession being explicitly set on a service class.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]   
public class CalculatorService : ICalculatorInstance   
{   
    ...  
}  

また、 ServiceBehaviorAttribute.InstanceContextMode プロパティは InstanceContext の解放頻度を制御しますが、 OperationBehaviorAttribute.ReleaseInstanceMode プロパティと ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete プロパティはサービス オブジェクトの解放時期を制御します。And while the ServiceBehaviorAttribute.InstanceContextMode property controls how often the InstanceContext is released, the OperationBehaviorAttribute.ReleaseInstanceMode and ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete properties control when the service object is released.

既知のシングルトン サービスWell-Known Singleton Services

単一インスタンス サービス オブジェクトの 1 つのバリエーションとして、サービス オブジェクトをユーザーが自分で作成し、このオブジェクトを使用してサービス ホストを作成すると有用な場合があります。One variation on single instance service objects is sometimes useful: you can create a service object yourself and create the service host using that object. そのためには、 ServiceBehaviorAttribute.InstanceContextMode プロパティを Single に設定するか、サービス ホストが開かれたときに例外をスローする必要があります。To do so, you must also set the ServiceBehaviorAttribute.InstanceContextMode property to Single or an exception is thrown when the service host is opened.

このようなサービスを作成するには、 ServiceHost.ServiceHost(Object, Uri[]) コンストラクターを使用します。Use the ServiceHost.ServiceHost(Object, Uri[]) constructor to create such a service. この方法は、シングルトン サービスが使用する特定のオブジェクト インスタンスを提供する場合に、カスタムの System.ServiceModel.Dispatcher.IInstanceContextInitializer を実装する代わりに使用できます。It provides an alternative to implementing a custom System.ServiceModel.Dispatcher.IInstanceContextInitializer when you wish to provide a specific object instance for use by a singleton service. サービス実装の型を作成することが困難な場合 (たとえば、既定のパラメーターなしのコンストラクターが作成されない場合) は、このオーバーロードを使用できます。You can use this overload when your service implementation type is difficult to construct (for example, if it does not implement a default parameterless public constructor).

このコンストラクターにオブジェクトが提供されている場合は、Windows Communication Foundation (WCF) のインスタンス化動作に関連する一部の機能が異なる動作をすることに注意してください。Note that when an object is provided to this constructor, some features related to the Windows Communication Foundation (WCF) instancing behavior work differently. たとえば、シングルトン オブジェクト インスタンスを指定しているときは、 InstanceContext.ReleaseServiceInstance を呼び出しても効果はありません。For example, calling InstanceContext.ReleaseServiceInstance has no effect when a singleton object instance is provided. 他のインスタンス解放機構も、同様に無視されます。Similarly, any other instance-release mechanism is ignored. ServiceHost は常に、すべての操作について OperationBehaviorAttribute.ReleaseInstanceMode プロパティが ReleaseInstanceMode.None に設定されているかのように動作します。The ServiceHost always behaves as if the OperationBehaviorAttribute.ReleaseInstanceMode property is set to ReleaseInstanceMode.None for all operations.

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

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

コンカレンシーConcurrency

コンカレンシーは、InstanceContext 内で同時にアクティブになるスレッドの数を制御します。Concurrency is the control of the number of threads active in an InstanceContext at any one time. 同時実行を制御するには、 ServiceBehaviorAttribute.ConcurrencyModeConcurrencyMode 列挙値を使用します。This is controlled by using the ServiceBehaviorAttribute.ConcurrencyMode with the ConcurrencyMode enumeration.

選択可能なコンカレンシー モードは次の 3 つです。The following three concurrency modes are available:

  • Single:各インスタンスコンテキストでは、インスタンスコンテキスト内でメッセージを処理するスレッドを一度に最大1つまで設定できます。Single: Each instance context is allowed to have a maximum of one thread processing messages in the instance context at a time. 他のスレッドは、最初のスレッドがインスタンス コンテキストを使用し終えるまで、同じインスタンス コンテキストを使用できません。Other threads wishing to use the same instance context must block until the original thread exits the instance context.

  • Multiple:各サービスインスタンスは、メッセージを同時に処理する複数のスレッドを持つことができます。Multiple: Each service instance can have multiple threads processing messages concurrently. このコンカレンシー モードを使用するには、サービスの実装がスレッドセーフである必要があります。The service implementation must be thread-safe to use this concurrency mode.

  • Reentrant:各サービスインスタンスは一度に1つのメッセージを処理しますが、再入操作の呼び出しを受け入れます。Reentrant: Each service instance processes one message at a time, but accepts re-entrant operation calls. サービスは、WCF クライアントオブジェクトを介して呼び出しを行う場合にのみ、これらの呼び出しを受け入れます。The service only accepts these calls when it is calling out through a WCF client object.

注意

複数のスレッドを安全に使用するコードを理解し、適切に記述することが困難な場合もあります。Understanding and developing code that safely uses more than one thread can be difficult to write successfully. Multiple 値や Reentrant 値を使用する前に、これらのモード用にサービスが適切に設計されていることを確認してください。Before using Multiple or Reentrant values, ensure that your service is properly designed for these modes. 詳細については、「 ConcurrencyMode 」を参照してください。For more information, see ConcurrencyMode.

コンカレンシーの使用は、インスタンス化モードに関連します。The use of concurrency is related to the instancing mode. インスタンスPerCall化では、各メッセージが新しいInstanceContextによって処理されるため、同時実行は関係ありません。したがって、 InstanceContextでは、複数のスレッドがアクティブになることはありません。In PerCall instancing, concurrency is not relevant, because each message is processed by a new InstanceContext and, therefore, never more than one thread is active in the InstanceContext.

ConcurrencyMode プロパティを Multipleに設定するコード例を次に示します。The following code example demonstrates setting the ConcurrencyMode property to Multiple.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]   
public class CalculatorService : ICalculatorConcurrency   
{   
    ...  
}  

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

セッションと InstanceContext は、コントラクト内の SessionMode 列挙値と、チャネルと特定のサービス オブジェクト間の関連付けを制御するサービス実装の ServiceBehaviorAttribute.InstanceContextMode プロパティ値の組み合わせに応じて、相互に作用します。Sessions and InstanceContext interact depending upon the combination of the value of the SessionMode enumeration in a contract and the ServiceBehaviorAttribute.InstanceContextMode property on the service implementation, which controls the association between channels and specific service objects.

サービスの ServiceContractAttribute.SessionMode プロパティと ServiceBehaviorAttribute.InstanceContextMode プロパティの値の組み合わせが指定されているという条件で、セッションをサポートしている受信チャネルまたはサポートしていない受信チャネルの結果を次の表に示します。The following table shows the result of an incoming channel either supporting sessions or not supporting sessions given a service's combination of the values of the ServiceContractAttribute.SessionMode property and the ServiceBehaviorAttribute.InstanceContextMode property.

InstanceContextMode 値InstanceContextMode value Required Allowed NotAllowed
PerCallPerCall -セッションフルチャネルでの動作:各呼び出しのInstanceContextセッションと。- Behavior with sessionful channel: A session and InstanceContext for each call.
-セッションレスチャネルでの動作:例外がスローされます。- Behavior with sessionless channel: An exception is thrown.
-セッションフルチャネルでの動作:各呼び出しのInstanceContextセッションと。- Behavior with sessionful channel: A session and InstanceContext for each call.
-セッションレスチャネルでの動作:各InstanceContext呼び出しの。- Behavior with sessionless channel: An InstanceContext for each call.
-セッションフルチャネルでの動作:例外がスローされます。- Behavior with sessionful channel: An exception is thrown.
-セッションレスチャネルでの動作:各InstanceContext呼び出しの。- Behavior with sessionless channel: An InstanceContext for each call.
PerSessionPerSession -セッションフルチャネルでの動作:各チャネルのInstanceContextセッションと。- Behavior with sessionful channel: A session and InstanceContext for each channel.
-セッションレスチャネルでの動作:例外がスローされます。- Behavior with sessionless channel: An exception is thrown.
-セッションフルチャネルでの動作:各チャネルのInstanceContextセッションと。- Behavior with sessionful channel: A session and InstanceContext for each channel.
-セッションレスチャネルでの動作:各InstanceContext呼び出しの。- Behavior with sessionless channel: An InstanceContext for each call.
-セッションフルチャネルでの動作:例外がスローされます。- Behavior with sessionful channel: An exception is thrown.
-セッションレスチャネルでの動作:各InstanceContext呼び出しの。- Behavior with sessionless channel: An InstanceContext for each call.
SingleSingle -セッションフルチャネルでの動作:セッションと、すべてInstanceContextの呼び出しの1つ。- Behavior with sessionful channel: A session and one InstanceContext for all calls.
-セッションレスチャネルでの動作:例外がスローされます。- Behavior with sessionless channel: An exception is thrown.
-セッションフルチャネルでの動作:作成されInstanceContextたシングルトンまたはユーザー指定のシングルトンのセッション。- Behavior with sessionful channel: A session and InstanceContext for the created or user-specified singleton.
-セッションレスチャネルでの動作:作成されたシングルトンまたはユーザー指定のシングルトンの。InstanceContext- Behavior with sessionless channel: An InstanceContext for the created or user-specified singleton.
-セッションフルチャネルでの動作:例外がスローされます。- Behavior with sessionful channel: An exception is thrown.
-セッションレスチャネルでの動作:作成されたシングルトンまたはユーザー指定のシングルトンのそれぞれの。InstanceContext- Behavior with sessionless channel: An InstanceContext for each created singleton or for the user-specified singleton.

関連項目See also