C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/03/23 02:09
[ インスタンス コンテキスト モード ]
WCFでは、サービスのインスタンス化方式が3種類あります。

クライアント毎にサービスのインスタンスを生成
クライアントを識別しサービスのインスタンスを生成し、クライアントが一連の処理を終えるまで ( クライアントのサービス プロキシ オブジェクトがクローズするまで ) インスタンスを保持します。

要求毎にサービスのインスタンスを生成
サービスのメソッドが呼び出される度にサービスのインスタンスを生成します。一つのインスタンスは一度のメソッド呼び出しにしか使用されません。

シングルトン
サービスのインスタンスは常に一つだけ存在し、すべてのクライアントの要求に対して同一のインスタンスが使用されます。


従来のASP.NET Webサービスでは、「 要求毎にサービスのインスタンスを生成」する方式しかサポートしていませんでした。.NET Remoting では、3つ全ての方式をサポートしていました。

WCFでは、完全にこの3つの方式をサポートしています。Webサービスでもクライアント毎にサービスのインスタンスを生成したり ( .NET Remoting の CAO における、リースやスポンサーといった概念はないようです。 ) シングルトンにすることができます。

WCFでは、既定で「クライアント毎にサービスのインスタンスを生成」する方式が適用されます。


[ インスタンス コンテキスト モードの指定 ]
インスタンス コンテキスト モードを指定するには、サービスクラスの属性として ServiceBehaviorAttribute クラス (System.ServiceModel) を付加し、この属性の InstanceContextMode プロパティ を設定します。このプロパティの型は InstanceContextMode 列挙体 (System.ServiceModel) です。
InstanceContextMode 列挙体には以下の3つの列挙値が用意されています。これらは、この記事の最初に挙げた3つの方式と関連付けされています。 ( デフォルトは "PerSession" 。 )

InstanceContextMode.PerSession
クライアント毎にサービスのインスタンスを生成

InstanceContextMode.PerCall
要求毎にサービスのインスタンスを生成

InstanceContextMode.Single
シングルトン


[ セッションモード ]
インスタンス コンテキスト モードが "PerSession" に設定されている場合、 サービス コントラクトの ServiceContractAttribute 属性SessionMode プロパティ が "Required" または "Allowed" に設定されている必要があります。このプロパティの型は SessionMode 列挙体 (System.ServiceModel) です。 ( デフォルトは "Allowed" 。 )


[ スロットルの設定 ]
[ behaviors ] - [ serviceBehaviors ] - [ behavior ] セクション に属する [ serviceThrottling ] セクション の各属性 ( プログラムコードで扱うのなら ServiceThrottlingBehavior クラス (System.ServiceModel.Description) の各プロパティ ) でスロットルの設定を行うことができます。

maxConcurrentCalls

一つのサービス インスタンスに対して可能な同時呼び出しの最大値です。
この値を超える要求は、待機状態 ( 順番待ち ) となります。
デフォルトは16です。

maxConcurrentInstances
同時に存在できるサービス インスタンスの最大値です。
この値を超える要求は、待機状態 ( 順番待ち ) となります。
デフォルトは Int32.MaxValue です。

maxConcurrentSessions
一つのサービスに対して可能な同時呼び出しの最大値です。
この値を超える要求は、待機状態 ( 順番待ち ) となります。
デフォルトは10です。


[ リリース インスタンス モード ]
インスタンス コンテキスト モードが "PerSession" 、あるいは "Single" に設定されている場合、特定のオペレーション コントラクトが呼び出された際に、サービス インスタンスを強制的に解放するよう設定することができます。
この設定を行うには、サービス クラスのオペレーション コントラクトの属性として OperationBehaviorAttribute クラス (System.ServiceModel) を付加し、この属性の ReleaseInstanceMode プロパティ を設定します。このプロパティの型は ReleaseInstanceMode 列挙体 (System.ServiceModel) です。この列挙体には以下の4つの値があります。 ( デフォルトは "None" 。 )

BeforeCall
オペレーション コントラクトが呼び出される前に、強制的にサービス インスタンスを解放します。

AfterCall
オペレーション コントラクトが呼び出された後に、強制的にサービス インスタンスを解放します。

BeforeAndAfterCall
オペレーション コントラクトが呼び出される前と呼び出された後の両方で、強制的にサービス インスタンスを解放します。

None
サービス インスタンスの解放は行いません。


[ クライアントのサービス プロキシ オブジェクトからの解放要求 ]
インスタンス コンテキスト モードが "PerSession" に設定されている場合、クライアントのサービス プロキシ オブジェクトがクローズすると、サービス インスタンスも自動で解放されます。
ただし、サービス クラスの ServiceBehaviorAttribute 属性の AutomaticSessionShutdown プロパティ が "false" に設定されている場合は、解放は行われません。 ( デフォルトは "true" 。 )
「クライアントのサービス プロキシ オブジェクトがクローズする」というのは、サービス プロキシ クラスが実装する ICommunicationObject インターフェイス (System.ServiceModel)Close メソッド のことです。
( もう少し細かいことを言えば、クライアントのサービス プロキシ クラスが WSDL ファイルから自動生成されたクラスなら ClientBase ジェネリック クラス (System.ServiceModel)Close メソッド 、クライアントのサービス プロキシ クラスが ChannelFactory ジェネリック クラス (System.ServiceModel)CreateChannel メソッド から動的に生成されたクラスなら、そのクラスが実装した ICommunicationObject インターフェイス (System.ServiceModel)Close メソッド ってトコです。 )


[ 解放について ]
リリース インスタンス モードを設定したオペレーション コントラクトによって解放されたサービス インスタンスや、クライアントのサービス プロキシ オブジェクトがクローズしたため解放されたサービス インスタンスが、IDisposable インターフェイスを実装している場合、即座に IDisposable.Dispose メソッドが呼び出されます。 ( IDisposable インターフェイスを実装していない場合は当然Disposeメソッドの呼び出しは行われません。 )
その後、サービス インスタンスは GC 待ちとなります。
スポンサーサイト



タグ: .NET C# WCF