私の WCF サービス ライブラリは Windows サービスとしてホストされており、複数のクライアントからの要求を処理することになっています。クライアントが頻繁に行う 1 つの要求は、かなりリソースを集中的に使用します。
上記のシーンリオに関して 2 つの疑問があります。
- WCF サービスは複数のクライアントの要求をどのように処理しますか?
- プロセスを効率的にするための WCF 構成はありますか?
ありがとうございました!
既定のシナリオでは、WCF サービス ホスト (サービス クラスをホストするもの) は、受信した要求ごとにサービス クラスの新しいインスタンスを作成し、要求を処理します ("呼び出しごとの" アクティブ化)。
サーバー上の動作を使用して、同時にアクティブなサービス クラス インスタンスの最大数を調整できserviceThrottling
ます。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ThrottledServiceBehavior">
<serviceThrottling
maxConcurrentCalls="25"
maxConcurrentSessions="25"
maxConcurrentInstances="25"/>
</behavior>
</serviceBehaviors>
</behaviors>
Kenny Wolf のブログ投稿 (こちら) には、サービスのスロットリング動作のオプションとその既定値に関する非常に適切な説明があります。
また、(サービス コントラクトを実装する) サービス クラスのInstanceContextMode
との設定は、サービスが同時実行性と複数の要求を処理する方法に大きな影響を与えます。ConcurrencyMode
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,
ConcurrencyMode=ConcurrencyMode.Single)]
class YourServiceClass : IYourService
{
.....
}
InstanceContextMode
あるべきPerCall
(各呼び出し要求が新しい個別のインスタンスを取得する) であり、その後(開発が最も簡単な方法) にConcurrencyMode
なる可能性があります。Single
InstanceContextMode
セッションベースのアプローチがPerSession
必要な場合(あまり一般的ではありません)、またはSingle
(サービスクラスはシングルトンになります-これを使用することは強くお勧めしません. )。
ConcurrencyMode
Reentrant
(二重のコントラクトとバインディングにのみ関連する) またはMultiple
(マルチスレッドのシングルトン サービス クラス - 非常にリスクが高く、開発が難しい!) の場合もあります。
マルク