Search code examples
c#.netasp.net-coreinterceptorcastle-dynamicproxy

Intercept controllers


I am trying to create Audit logs for every controller so that I can keep track of invoked Actions. I am using .net core and Castle Core Dynamic Proxy.

class AuditInterceptor : IInterceptor
{
    private readonly IAuditingHelper _auditingHelper;

    public AuditingInterceptor(IAuditingHelper auditingHelper)
    {
        _auditingHelper = auditingHelper;
    }

    public void Intercept(IInvocation invocation)
    {
       invocation..Proceed();
       log.info(audit); // elided 
    }
}

How can I intercept every Controller ? I can use Simple injector or Autofac.

The reason I am not interested in Filters is that I have 4500 actions. I dont want to decorate them all.


Solution

  • You could use an action filter for this. You can retrieve useful information about the controller and action being executed from the ActionDescriptor. For example:

    public class AuditAttribute : ActionFilterAttribute
    {
       public override void OnActionExecuting(ActionExecutingContext context)
       {
           var actionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor;
           var controllerName = actionDescriptor.ControllerName;
           var actionName = actionDescriptor.ActionName;
           var parameters = actionDescriptor.Parameters;
           var fullName = actionDescriptor.DisplayName;
       }
    }
    

    You can register the action filter using an attribute on controllers/actions:

    [Audit]
    public async Task<IActionResult> Get()
    {
    }
    

    Or globally (every action) at application startup:

    services.AddMvc(c => c.Filters.Add(new AuditAttribute()));