2011-09-20 4 views
2

Je dispose d'un serveur et d'une application client NET.TCP WCF et souhaite fournir des statistiques dans le composant côté serveur pour la bande passante, TTL, etc. pour chaque client connecté. Pour obtenir la TTL, j'ai pu implémenter une nouvelle méthode de rebond entre le client et le serveur et mesurer la différence de temps, et mesurer le trafic je pourrais simplement compter les octets dans mes messages mais je me demandais s'il y a des stats intégrées dans le ServiceHost qui fournirait ce dont j'ai besoin.Bande passante et débit d'une connexion WCF

Le comptage des octets que j'ai dans mes objets peut également être trompeur car la liaison appliquera quand même le codage binaire pour les données.

+1

Je suppose que vous pourriez obtenir des nombres d'un MessageInspector personnalisé (assez sûr que j'ai écrit ceci sur stackoverflow), mais pour obtenir une image précise incluant les effets de transport, wireshark peut être meilleur. –

+0

Merci Marc. J'implémenterai MessageInspector ajouter octets accumulate et in et dériver des octets/seconde à partir de cela. – tonycoupland

Répondre

4

Combinaison this blog et chalutage des documents en ligne J'ai mis en place un inspecteur de message, un comportement personnalisé et l'ai appliqué à mon service. Comme mon service est en duplex, pour capturer tout le trafic, j'ai besoin d'ajouter des inspecteurs de message à la fois au point d'extrémité côté serveur et au runtime du client de rappel. Ce point semble manquer dans de nombreux exemples en ligne.

personnalisé Inspecteur

public class EndPointMessageInspector : IDispatchMessageInspector, IClientMessageInspector 
{ 
    static long _bytesWritten = 0; 
    static long _bytesRead = 0; 

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
     request = buffer.CreateMessage(); 
     _bytesRead += buffer.CreateMessage().ToString().Length; 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if (reply != null) 
     { 
      MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
      reply = buffer.CreateMessage(); 
      _bytesWritten += buffer.CreateMessage().ToString().Length; 
     } 
    } 

    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     // No replies expected from Duplex call backs 
    } 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel) 
    { 
     if (request != null) 
     { 
      MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
      request = buffer.CreateMessage(); 
      _bytesWritten += buffer.CreateMessage().ToString().Length; 
     } 
     return null; 
    } 
} 

service personnalisé Comportement

[AttributeUsage(AttributeTargets.Class)] 
public class GatherThroughputBehaviour : Attribute, IServiceBehavior, IEndpointBehavior 
{ 
    #region IServiceBehavior Members 
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     for (int i = 0; i < serviceHostBase.ChannelDispatchers.Count; i++) 
     { 
      ChannelDispatcher channelDispatcher = serviceHostBase.ChannelDispatchers[i] as ChannelDispatcher; 
      if (channelDispatcher != null) 
      { 
       foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints) 
       { 
        EndPointMessageInspector inspector = new EndPointMessageInspector(); 
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); 
       } 
      } 
     } 
    } 

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
    } 
    #endregion 

    #region IEndpointBehavior Members 
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    { 
     endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new EndPointMessageInspector()); 
     endpointDispatcher.DispatchRuntime.CallbackClientRuntime.MessageInspectors.Add(new EndPointMessageInspector()); 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
     return; 
    } 
    #endregion 
} 

Appliquer le comportement à mon service

[GatherThroughputBehaviour] 
public class TunnelServer : IMyContract 
{ 
    ... 
} 
Questions connexes