2009-07-23 4 views
4

J'ai un service WCF PerSession net tcp, ma logique actuelle pour garder une trace du nombre d'utilisateurs connectés (clients actifs) utilise le constructeur de service et le mécanisme de pulsation. Dans le constructeur, je viens d'incrémenter un membre static, et lors de l'envoi de heartbeat au client si l'une de ces exceptions augmente (TimeoutException, FaultException, CommunicationObjectAbortedException) je décrémente le nombre.Suivi du nombre d'utilisateurs connectés au service WCF?

Aussi j'utilise le rythme cardiaque pour envoyer d'autres choses. Jusqu'à maintenant cela fonctionne parfaitement, mais y a-t-il un meilleur moyen?

+0

Pourriez-vous simplement utiliser les compteurs de performance intégrés dans WCF pour vérifier cela? On dirait beaucoup de travail inutile pour gérer ça vous-même, vraiment ..... –

+0

D'accord, cela semble une bonne solution, mais cela signifie que je vais utiliser le compteur pf par programme et cela peut diminuer les performances, n'est-ce pas? –

Répondre

2

Vous pouvez créer votre implémentation de IInstanceContextInitializer qui sera notifiée après la création d'un nouvel 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 
    } 
    } 

et l'attacher

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) 
    { } 
    } 

Une fois que vous avez accès à InstanceContext vous pouvez utiliser IncomingChannels propriété pour obtenir les canaux qui sont sessionful entrant à l'instance de service.