在Asp.net MVC和Web API中实现审计跟踪的干净方法是什么

本文关键字:审计跟踪 是什么 方法 实现 net Asp MVC API Web | 更新日期: 2023-09-27 18:14:24

我正在寻找一种更干净的方法,将审计跟踪功能添加到现有的asp.net MVC和Web Api项目中,该项目包含数百个ControllerApiController

审核跟踪日志如下所示。基本上,我只想在这个函数中记录In what time who did what

UserID
ActionTime
Controller 
Action

我错过了什么?如果有的话。请纠正我。谢谢。

目前我发现有一些方法可以做到。

  1. 实现一个ActionFilterAttribute,并在OnActionExecuting中编写我自己的日志函数,然后用这个属性装饰所有操作。

  2. 为所有现有的控制器实现类似BaseController的基本Controller。并在OnActionExecuting中写入日志。然后将所有控制器更改为继承自BaseController。(如果是错的。请纠正我。谢谢。(

  3. 对于CCD_ 10。实现DelegatingHandler使其成为

对于1和2。我需要更改所有现有的代码来实现它。比如更改基类或用新属性装饰。考虑到我的情况,这将是一项艰苦的工作。因为成千上万的类或方法需要更改。我觉得有点冗长。所以我想知道ApiController是否有一些像3这样干净的方法来制作它。谢谢。

在Asp.net MVC和Web API中实现审计跟踪的干净方法是什么

我发现使用全局操作过滤器是处理交叉/面向方面问题的最佳方式。

请注意,此代码未经过测试。

public class AuditFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var userName = HttpContext.Current.User.Identity.Name;
        var time = DateTime.Now.ToString(CultureInfo.InvariantCulture);
        var controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
        var actionName = actionContext.ActionDescriptor.ActionName
        Logger.Log(string.Format("user: {0}, date: {1}, controller {2}, action {3}", userName, time, controllerName, actionName));
    }
}

在应用程序启动管道的某个位置,全局注册过滤器:

GlobalConfiguration.Configuration.Filters.Add(new AuditFilter());

您正在使用DI容器吗?如果您正在或想要使用DI容器,那么它可以拦截对控制器的所有请求。这样就不会更改数百个控制器中的代码,尽管更改很简单。

这是温莎城堡。

public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
    _kernel = kernel;
}
public override void ReleaseController(IController controller)
{
    _kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
    if (controllerType == null)
    {
        throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
    }
    return (IController)_kernel.Resolve(controllerType);
}
}

如果你打算使用它,请看一下这个网站上的例子。我相信有一种方法可以将它用于Web API和MVC控制器。