gpt4 book ai didi

c# - 来自 IOperationInvoker 的方法名称

转载 作者:行者123 更新时间:2023-11-30 14:36:27 26 4
gpt4 key购买 nike

我最近阅读了 Juval Lowy 的Programming WCF Services, Third Edition。我正在利用下面显示的他的 ParameterTracerInvoker : GenericInvoker 使用 NLOG 跟踪日志。除了我认为不可能的一件事外,它工作得很好,那就是获取正在调用的 MethodName。正如您在 PreInvoke 方法中看到的那样,我正在记录输入,而不是方法名称。有人知道如何检索方法名称吗?

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();
}
/// <summary>
/// Exceptions here will abort the call
/// </summary>
/// <returns></returns>
protected virtual void PreInvoke(object instance, object[] inputs)
{ }

/// <summary>
/// Always called, even if operation had an exception
/// </summary>
/// <returns></returns>
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(((SyncMethodInvoker)_oldInvoker).MethodName);
_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);
}
}

最佳答案

IOperationInvoker 本身不会为您提供操作名称,但为了使用自定义调用程序,您通常会使用操作行为。该行为可以访问操作名称,并且可以将其传递给您的自定义调用程序:

public class ParameterTracerOperationBehavior : IOperationBehavior
{
// ...

public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
var originalInvoker = dispatchOperation.Invoker;
var operationName = operationDescription.Name;
var newInvoker = new ParameterTracerInvoker(originalInvoker, operationName);
dispatchOperation.Invoker = newInvoker;
}
}

public class ParameterTracerInvoker
{
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
private readonly string operationName;
public ParameterTracerInvoker(IOperationInvoker oldInvoker, string operationName)
: base(oldInvoker)
{
this.operationName = operationName;
}

// ...
}

关于c# - 来自 IOperationInvoker 的方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10488972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com