2009-07-23 8 views
4

Ich habe einen Net TCP PerSession WCF-Dienst, meine aktuelle Logik für die Verfolgung der Anzahl der verbundenen Benutzer (aktive Clients) verwendet den Dienst Konstruktor und Heartbeat-Mechanismus.Die Anzahl der verbundenen Benutzer im WCF-Dienst verfolgen?

im Konstruktor Ich habe nur ein statisches Member inkrementiert, und beim Senden von Heartbeat an den Client, wenn eine dieser Ausnahmen ausgelöst wird (TimeoutException, FaultException, CommunicationObjectAbortedException) dekrementiere ich die Zahl.

Auch ich benutze Herzschlag zum Senden anderer Sachen. Bis jetzt funktioniert es perfekt, aber gibt es einen besseren Weg?

+0

Können Sie nicht einfach die integrierten Leistungsindikatoren in WCF verwenden, um das zu überprüfen? Scheint wie eine Menge unnötige Arbeit, um das selbst zu handhaben, wirklich ... –

+0

Okay, es scheint gute Lösung, aber das bedeutet, ich werde den PF-Zähler programmgesteuert verwenden, und dies kann die Leistung verringern, nicht wahr? –

Antwort

2

Sie können Ihre Implementierung von IInstanceContextInitializer erstellen, die benachrichtigt wird, sobald neuer InstanceContext erstellt wird.

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

und befestigen Sie es

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

Einmal hast du Zugriff auf InstanceContext können Sie IncomingChannels Eigenschaft verwenden, um die sitzungs-Kanäle, die der Service-Instanz eingehenden.

Verwandte Themen