Вот инспектор параметров, который я однажды написал для измерения производительности моих методов службы WCF. Обратите внимание, что Секундомер запускается и возвращается в методе BeforeCall
, который позволяет получить его в методе AfterCall
в качестве параметра 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
}
}
Разница в том, что при использовании инспектора параметров не будет учитываться время, затрачиваемое на сериализацию параметров ввода / вывода. Это будет учитывать только время операции. Если вы хотите включить время сериализации, вы можете использовать IDispatchMessageInspector . Метод BeforeSendReply также имеет correlationState
, который работает так же.
UPDATE:
Вы можете настроить инспектор параметров в web.config, написав расширение поведения:
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)
{
}
}
И в вашем конфигурационном файле вы регистрируете расширение:
<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>