拦截控制器

Intercept controllers

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

class AuditInterceptor : IInterceptor
{
    private readonly IAuditingHelper _auditingHelper;

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

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

如何拦截每个控制器?我可以使用 Simple injector 或 Autofac。

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

您可以为此使用 action filter。您可以从 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;
   }
}

您可以使用 controllers/actions 上的属性注册操作过滤器:

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

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

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