我遇到了 WCF 项目的问题。我正在尝试扩展实现自定义操作调用程序的 wcf 行为以记录所有异常,保存操作名称和操作输入。同步函数没有问题,但是异步函数我不知道如何在 InvokeEnd 中获取输入参数,这是我写的代码:
public class OperationInvokerWithLogger : IOperationInvoker
{
private IOperationInvoker _baseInvoker;
private DispatchOperation _operation;
private OperationDescription _operationDescription;
public OperationInvokerWithLogger(
OperationDescription operationDescription,
DispatchOperation operation
)
{
_baseInvoker = operation.Invoker;
_operationDescription = operationDescription;
_operation = operation;
}
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
try
{
return _baseInvoker.Invoke(instance, inputs, out outputs);
}
catch (Exception ex)
{
LogOperationException(_operationDescription.Name, inputs, ex);
throw;
}
}
public bool IsSynchronous => _baseInvoker.IsSynchronous;
public object[] AllocateInputs() => _baseInvoker.AllocateInputs();
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
try
{
var asyncResult = _baseInvoker.InvokeBegin(instance, inputs, callback, state);
return asyncResult;
}
catch (Exception ex)
{
LogOperationException(_operationDescription.Name, inputs, ex);
throw;
}
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
try
{
var taskResult = _baseInvoker.InvokeEnd(instance, out outputs, result);
return taskResult;
}
catch (Exception ex)
{
LogOperationException(_operationDescription.Name, inputs, ex);
throw;
}
}
}
如果 _baseInvoker.InvokeBegin 抛出异常,我需要记录 InvokeBegin 函数的“输入”参数。我想我应该使用 _baseInvoker.InvokeBegin 的“状态”参数,但我现在不知道如何传递我的自定义参数而不是“状态”,函数永远不会结束。使用调试器检查代码,“state”参数似乎是一个 System.ServiceModel.Dispatcher.MessageRpc.Wrapper 对象。
有什么建议么?谢谢