WCF

概要

WCFサービスクラスはデフォルトではクライアントとのセッションが維持されます。つまり、クライアントの接続があると、対応する1つのサービスクラスのインスタンスが作成されます。つまり1000クライアントから同時接続されると、1000ものインスタンスが作成されます。これはサービスクラスに付与する ServiceBehavor.InstanceContextMode のデフォルト値がInstanceContextMode.PerSessionとなっているためです。InstanceContextModeの種類は次のとおり

PerSessionServiceBehavior のデフォルト値.各セッション(クライアントから接続があるたび)に、新しくインスタンスが作成されます。 OperationBehavior.ReleaseInstanceModeを指定しない限り、クライアントのプロキシを閉じると、インスタンスが破棄されます。
PerCallクライアントがサービスメソッドを呼び出すたびに、新しくインスタンスが作成されます。このモードではセッションごとにインスタンスが作成されないので、スケーラビリティが改善されます。ただし、状態を維持する必要がある場合は、独自で状態管理の方法を実装する必要があります。
Singleサービスクラスの1つのインスタンスのみ作成されます。複数のクライアントが接続しても、サービスクラスのインスタンスは1つのみとなります。このインスタンスはWCFのホストプログラムが停止したときのみ破棄されます。

以下のようにサービスクラスのServiceBehaviorAttributeで指定します。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class ProductService : IProductService
{....}

ServiceBehavior.InstanceContextModeをInstanceContextMode.Single とすると、同時に複数のクライアントがサービスメソッドを呼び出しても同時に1つの要求のみが処理されます。そのため、多くのクライアントからリクエストを受けるとタイムアウトが大量に発生する可能性があります。これを避ける場合のひとつの方法として、 ServiceBehavior.ConcurrencyModeをSingle(デフォルト)からMultiple にすることで、複数のリクエストを同時に処理できるようになります。ただし、スレッドセーフではなくなるので、同期が必要な処理はサービスクラスの定義者が実装する必要があります。ServiceConcurrencyMode.Reentrantはサービスクラス自身はシングルスレッドで実行されますが、サービスクラス内で別のサービスを呼び出し、呼び出し先の別サービスからコールバックメソッドを呼び出すことができるようにするモードです。

メニュー

  1. サービスクラスのインスタンスの生存期間
  2. サービスメソッドの呼び出し順の制御

トップ   編集 凍結解除 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:44:12 (1628d)

e[NȂECir Yahoo yV LINEf[^[Ōz500~`I
z[y[W ̃NWbgJ[h COiq@COsیI COze