I recently read the WCF Services Program, the third edition of Juval Lowy. I use it ParameterTracerInvoker : GenericInvokershown below to track the log using NLOG. It works great, except that, it seems to me, itβs not possible what causes the call MethodName. As you can see in the method PreInvoke, I register the input, but not the name of the method. Does anyone know how to get the method name?
public abstract class GenericInvoker : IOperationInvoker
{
internal readonly IOperationInvoker _oldInvoker;
public GenericInvoker(IOperationInvoker oldInvoker)
{
Debug.Assert(oldInvoker != null);
_oldInvoker = oldInvoker;
}
public virtual object[] AllocateInputs()
{
return _oldInvoker.AllocateInputs();
}
protected virtual void PreInvoke(object instance, object[] inputs)
{ }
protected virtual void PostInvoke(object instance, object returnedValue, object[] outputs, Exception exception)
{ }
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
PreInvoke(instance, inputs);
object returnedValue = null;
object[] outputParams = new object[] { };
Exception exception = null;
try
{
returnedValue = _oldInvoker.Invoke(instance, inputs, out outputParams);
outputs = outputParams;
return returnedValue;
}
catch (Exception operationException)
{
exception = operationException;
throw;
}
finally
{
PostInvoke(instance, returnedValue, outputParams, exception);
}
}
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
PreInvoke(instance, inputs);
return _oldInvoker.InvokeBegin(instance, inputs, callback, state);
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
object returnedValue = null;
object[] outputParams = { };
Exception exception = null;
try
{
returnedValue = _oldInvoker.InvokeEnd(instance, out outputs, result);
outputs = outputParams;
return returnedValue;
}
catch (Exception operationException)
{
exception = operationException;
throw;
}
finally
{
PostInvoke(instance, returnedValue, outputParams, exception);
}
}
public bool IsSynchronous
{
get
{
return _oldInvoker.IsSynchronous;
}
}
}
public class ParameterTracerInvoker : GenericInvoker
{
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
public ParameterTracerInvoker(IOperationInvoker oldInvoker)
: base(oldInvoker)
{
}
protected override void PreInvoke(object instance, object[] inputs)
{
_logger.Trace("Input Parameters:");
foreach (object argument in inputs)
{
if (argument != null)
{
_logger.Trace(argument.ToString());
}
else
{
_logger.Trace("null");
}
}
}
protected override void PostInvoke(object instance, object returnedValue, object[] outputs, Exception exception)
{
foreach (object output in outputs)
{
_logger.Trace("Output Parameters:");
_logger.Trace(output.ToString());
}
returnedValue = "aaaaaaaaaaaa";
_logger.Trace("Returned: " + returnedValue ?? String.Empty);
}
}
source
share