"セッション" とは、2 つのエンドポイント間で送信されるすべてのメッセージを相互に関連付けたものです。"インスタンス化" とは、ユーザー定義のサービス オブジェクトとこれらのオブジェクトに関連する InstanceContext オブジェクトの有効期間を制御することです。また、同時実行は、InstanceContext で同時に実行されるスレッドの数の制御を表す用語です。
ここでは、これらの設定とその使用方法、各設定間のさまざまな相互作用について説明します。
セッション
サービス コントラクトによって System.ServiceModel.ServiceContractAttribute.SessionMode プロパティが System.ServiceModel.SessionMode.Required に設定されている場合、すべての呼び出し (つまり、呼び出しをサポートする、基になるメッセージ交換) を同じメッセージ交換の一部にする必要があります。セッションが許可されるが必須ではないコントラクトの場合、クライアントは、接続した後にセッションを確立できます。また、セッションを確立しないままにしておくこともできます。セッションが終了したのに、同じセッション ベースのチャネルでメッセージが送信されると、例外がスローされます。
WCF セッションには、次のような主要な概念的特徴があります。
-
呼び出し側のアプリケーションによって明示的に開始され、終了される。
-
セッション中に配信されたメッセージは、受信された順に処理される。
-
セッションはメッセージのグループを相互に関連付けて通信を行う。ここで "相互に関連付ける" は、抽象的な意味を持ちます。たとえば、あるセッション ベースのチャネルでは、共有ネットワーク接続に基づいてメッセージが相互に関連付けられる一方、別のセッション ベースのチャネルでは、メッセージ本文にある共有タグに基づいてメッセージが相互に関連付けられます。セッションから派生可能な機能は、相互関連付けの性質によって異なります。
-
WCF セッションに関連付けられた一般的なデータ ストアはない。
ASP.NET アプリケーションの System.Web.SessionState.HttpSessionState クラスに精通している場合は、この種のセッションと WCF セッションの間に次のような相違があることがわかります。
-
ASP.NET セッションは、常にサーバーによって開始される。
-
ASP.NET セッションは、暗黙的に順序付けされない。
-
ASP.NET セッションは、要求全体について一般的なデータ ストレージ機構を提供する。
クライアント アプリケーションとサービス アプリケーションでは、異なる方法でセッションと対話します。クライアント アプリケーションはセッションを開始し、セッション内で送信されてきたメッセージの受信と処理を行います。サービス アプリケーションでは、動作を追加するための機能拡張ポイントとしてセッションを使用できます。これは InstanceContext を直接操作する、またはカスタムのインスタンス コンテキスト プロバイダを実装することで可能になります。
インスタンス化
同時実行
同時実行は、InstanceContext 内で同時にアクティブになるスレッドの数を制御します。同時実行を制御するには、System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode と ConcurrencyMode 列挙値を使用します。
選択可能な同時実行モードは次の 3 つです。
-
Single: 各インスタンス コンテキストは、そのインスタンス コンテキスト内でメッセージを処理するスレッドを最大で一度に 1 つ持つことができます。他のスレッドは、最初のスレッドがインスタンス コンテキストを使用し終えるまで、同じインスタンス コンテキストを使用できません。
-
Multiple: 各サービス インスタンスは、同時にメッセージを処理する複数のスレッドを持つことができます。この同時実行モードを使用するには、サービスの実装がスレッドセーフである必要があります。
-
Reentrant : 各サービス インスタンスは、一度に 1 つのメッセージを処理しますが、再入操作の呼び出しを受け入れます。サービスは、WCF クライアント オブジェクトを通じて呼び出しを行う場合のみ、この呼び出しを受け入れます。
メモ : |
|---|
|
複数のスレッドを安全に使用するコードを理解し、適切に記述することが困難な場合もあります。Multiple 値や Reentrant 値を使用する前に、これらのモード用にサービスが適切に設計されていることを確認してください。詳細な情報については、次のページを参照してください。 ConcurrencyMode.
|
同時実行の使用は、インスタンス化モードに関連します。PerCall インスタンス化では、各メッセージが新しい InstanceContext によって処理され、InstanceContext で複数のスレッドがアクティブになることはあり得ないため、同時実行は関係ありません。
ConcurrencyMode プロパティを Multiple に設定するコード例を次に示します。
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
…
}
InstanceContext 設定と対話するセッション
セッションと InstanceContext は、コントラクト内の SessionMode 列挙値と、チャネルと特定のサービス オブジェクト間の関連付けを制御するサービス実装の System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode プロパティ値の組み合わせに応じて、相互に作用します。
サービスの System.ServiceModel.ServiceContractAttribute.SessionMode プロパティと System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode プロパティの値の組み合わせが指定されているという条件で、セッションをサポートしている受信チャネルまたはサポートしていない受信チャネルの結果を次の表に示します。
|
InstanceContextMode 値
|
Required
|
Allowed
|
NotAllowed
|
|---|
|
PerCall
|
-
セッションフル チャネルでの動作 : 呼び出しごとに 1 つのセッションと InstanceContext。
-
セッションレス チャネルでの動作 : 例外がスローされます。
|
-
セッションフル チャネルでの動作 : 呼び出しごとに 1 つのセッションと InstanceContext。
-
セッションレス チャネルでの動作 : 呼び出しごとに InstanceContext。
|
-
セッションフル チャネルでの動作 : 例外がスローされます。
-
セッションレス チャネルでの動作 : 呼び出しごとに 1 つの InstanceContext。
|
|
PerSession
|
-
セッションフル チャネルでの動作 : チャネルごとに 1 つのセッションと InstanceContext。
-
セッションレス チャネルでの動作: 例外がスローされます。
|
-
セッションフル チャネルでの動作 : チャネルごとに 1 つのセッションと InstanceContext。
-
セッションレス チャネルでの動作 : 呼び出しごとに 1 つの InstanceContext。
|
-
セッションフル チャネルでの動作: 例外がスローされます。
-
セッションレス チャネルでの動作 : 呼び出しごとに 1 つの InstanceContext。
|
|
Single
|
-
セッションフル チャネルでの動作 : すべての呼び出しに対して 1 つのセッションと 1 つの InstanceContext。
-
セッションレス チャネルでの動作: 例外がスローされます。
|
-
セッションフル チャネルでの動作 : 作成したシングルトンまたはユーザー指定のシングルトンに対して 1 つのセッションと InstanceContext。
-
セッションレス チャネルでの動作 : 作成したシングルトンまたはユーザー指定のシングルトンに対して InstanceContext。
|
-
セッションフル チャネルでの動作: 例外がスローされます。
-
セッションレス チャネルでの動作 : 作成したシングルトンまたはユーザー指定のシングルトンごとに InstanceContext。
|
関連項目