MFeltrin
MFeltrin

Reputation: 3

Wcf operation invoker, log inputs parameter inside InvokeEnd

I'm stuck with an issue with WCF project. I'm tring to extend wcf behavior implementing a custom operation invoker to log all the exceptions, saving the operation name and operation inputs. No problem with syncronous function, but with the asynchronous one I don't konow how to get the input parameters inside InvokeEnd, this is the code I've wrote:

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;
        }
    }
}

If _baseInvoker.InvokeBegin throw exceptions, I need to log the "inputs" parameter of the InvokeBegin function. I suppose I should work with "state" parameter of the _baseInvoker.InvokeBegin, but i don't now how, if pass my custom parameter instead of "state", the function never ends. Inspecting the code with debugger, "state" parameter seems to be an System.ServiceModel.Dispatcher.MessageRpc.Wrapper object.

Any suggestions? Thanks

Upvotes: 0

Views: 220

Answers (0)

Related Questions