2009-07-23 5 views
4

私はネットtcp PerSession WCFサービスを持っています。接続されたユーザー(アクティブなクライアント)の数を追跡する現在のロジックは、サービスコンストラクタとハートビートメカニズムを使用しています。WCFサービスに接続しているユーザーのトラック番号を保持していますか?

コンストラクタ私は静的メンバをインクリメントし、これらの例外の1つが発生した場合(TimeoutException、FaultException、CommunicationObjectAbortedException)、クライアントにハートビートを送信している間、この番号を減らします。

また、私は他のものを送信するためにハートビートを使用しています。 これまでは完璧に動作しましたが、より良い方法はありますか?

+0

WCFで組み込みのパフォーマンスカウンタを使用して確認できませんでしたか? .....実際には、自分で処理するために多くの不必要な作業があるように思えます。 –

+0

これは良い解決策ですが、これはpfカウンタをプログラムで使用するため、パフォーマンスが低下する可能性があります。 –

答えて

2

IInstanceContextInitializerの実装を作成できます。これは、新しいInstanceContextが作成されると通知されます。

public class MyInstanceContextInitializer : IInstanceContextInitializer 
    { 
    public void Initialize(InstanceContext instanceContext, Message message) 
    { 
     // hook up to events to get notified about changes in the state of this instance context. 
     // remember refernce to it 
    } 
    } 

とあなたがInstanceContextへのアクセスを得たら、それは

public class InstanceInitializerBehavior : IEndpointBehavior 
    { 

    public void AddBindingParameters(ServiceEndpoint serviceEndpoint, BindingParameterCollection bindingParameters) 
    { } 

    //Apply the custom IInstanceContextProvider to the EndpointDispatcher.DispatchRuntime 
    public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher) 
    { 
     MyInstanceContextInitializer extension = new MyInstanceContextInitializer(); 
     endpointDispatcher.DispatchRuntime.InstanceContextInitializers.Add(extension); 
    } 

    public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior) 
    { } 

    public void Validate(ServiceEndpoint endpoint) 
    { } 
    } 

あなたがサービスインスタンスに着信さsessionfulチャンネルを取得するためにIncomingChannelsプロパティを使用することができます添付。

関連する問題