拦截控制器
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()));
我正在尝试为每个控制器创建审核日志,以便我可以跟踪调用的操作。我正在使用 .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()));