概要 †WCFサービスクラスはデフォルトではクライアントとのセッションが維持されます。つまり、クライアントの接続があると、対応する1つのサービスクラスのインスタンスが作成されます。つまり1000クライアントから同時接続されると、1000ものインスタンスが作成されます。これはサービスクラスに付与する ServiceBehavor.InstanceContextMode のデフォルト値がInstanceContextMode.PerSessionとなっているためです。InstanceContextModeの種類は次のとおり
以下のようにサービスクラスのServiceBehaviorAttributeで指定します。 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class ProductService : IProductService {....} ServiceBehavior.InstanceContextModeをInstanceContextMode.Single とすると、同時に複数のクライアントがサービスメソッドを呼び出しても同時に1つの要求のみが処理されます。そのため、多くのクライアントからリクエストを受けるとタイムアウトが大量に発生する可能性があります。これを避ける場合のひとつの方法として、 ServiceBehavior.ConcurrencyModeをSingle(デフォルト)からMultiple にすることで、複数のリクエストを同時に処理できるようになります。ただし、スレッドセーフではなくなるので、同期が必要な処理はサービスクラスの定義者が実装する必要があります。ServiceConcurrencyMode.Reentrantはサービスクラス自身はシングルスレッドで実行されますが、サービスクラス内で別のサービスを呼び出し、呼び出し先の別サービスからコールバックメソッドを呼び出すことができるようにするモードです。 メニュー † |