5

私の WCF サービス ライブラリは Windows サービスとしてホストされており、複数のクライアントからの要求を処理することになっています。クライアントが頻繁に行う 1 つの要求は、かなりリソースを集中的に使用します。

上記のシーンリオに関して 2 つの疑問があります。

  1. WCF サービスは複数のクライアントの要求をどのように処理しますか?
  2. プロセスを効率的にするための WCF 構成はありますか?

ありがとうございました!

4

1 に答える 1

11

既定のシナリオでは、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(サービスクラスはシングルトンになります-これを使用することは強くお勧めしません. )。

ConcurrencyModeReentrant(二重のコントラクトとバインディングにのみ関連する) またはMultiple(マルチスレッドのシングルトン サービス クラス - 非常にリスクが高く、開発が難しい!) の場合もあります。

マルク

于 2009-10-09T10:44:54.670 に答える