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.
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()));