拦截控制器

时间:2018-06-20 16:59:13

标签: c# .net asp.net-core interceptor castle-dynamicproxy

我正在尝试为每个控制器创建审核日志,以便可以跟踪调用的操作。我正在使用.net core和Castle Core动态代理。

class AuditInterceptor : IInterceptor
{
    private readonly IAuditingHelper _auditingHelper;

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

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

如何拦截每个Controller?我可以使用简单注射器或Autofac。

我对过滤器不感兴趣的原因是我有4500次操作。我不想装饰它们全部。

1 个答案:

答案 0 :(得分:1)

您可以为此使用action filer。您可以从ActionDescriptor检索有关控制器和正在执行的动作的有用信息。例如:

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

您可以使用控制器/动作上的属性注册动作过滤器:

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

或在应用程序启动时全局(每次操作):

services.AddMvc(c => c.Filters.Add(new AuditAttribute()));
相关问题