Voici un inspecteur de paramètres que j'ai déjà écrit pour mesurer les performances de mes méthodes de service WCF. Notez qu'un Stopwatch est démarré et retourné dans la méthode BeforeCall
qui vous permet de le récupérer dans la méthode AfterCall
comme paramètre correlationState
:
public class PerformanceCountersInspector : IParameterInspector
{
public object BeforeCall(string operationName, object[] inputs)
{
return Stopwatch.StartNew();
}
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
var watch = (Stopwatch)correlationState;
watch.Stop();
var time = watch.ElapsedMilliseconds;
// Do something with the result
}
}
La différence ici est que l'aide d'un inspecteur des paramètres ne prendra pas en compte le temps pris pour sérialiser les paramètres d'entrée/sortie. Cela ne prendra en compte que l'heure de fonctionnement. Si vous souhaitez inclure le temps de sérialisation, vous pouvez utiliser IDispatchMessageInspector. La méthode BeforeSendReply a également un correlationState
qui fonctionne de la même manière.
MISE À JOUR:
Vous pouvez configurer l'inspecteur des paramètres dans web.config en écrivant une extension de comportement:
public class PerformanceCountersBehaviorExtension : BehaviorExtensionElement, IServiceBehavior
{
public override Type BehaviorType
{
get { return typeof(PerformanceCountersBehaviorExtension); }
}
protected override object CreateBehavior()
{
return this;
}
void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
{
foreach (var endpoint in channelDispatcher.Endpoints)
{
foreach (var operation in endpoint.DispatchRuntime.Operations)
{
var inspector = new PerformanceCountersInspector();
operation.ParameterInspectors.Add(inspector);
}
}
}
}
void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
Et dans votre fichier de configuration vous enregistrer l'extension:
<services>
<service name="MyAssembly.MyService" behaviorConfiguration="returnFaults">
<endpoint address="" binding="basicHttpBinding" contract="MyAssembly.IMyServiceContract"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="returnFaults">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true"/>
<perfCounters />
</behavior>
</serviceBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="perfCounters" type="MyAssembly.PerformanceCountersBehaviorExtension, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
Exceptionnel :) Merci Darin – dragonfly