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

时间:2015-09-25 01:41:47

标签: c# asp.net-mvc asp.net-mvc-5 audit

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

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

UserID

ActionTime

Controller 

Action

我错过了什么?如果有 。请指正。感谢。

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

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

  2. 为所有存在的控制器实现类似Controller的基础BaseController。并在OnActionExecuting中写入日志。然后将所有控制器更改为从BaseController继承。 (如果错了。请指正。谢谢。)

  3. 对于ApiController。实施DelegatingHandler来实现它。

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

2 个答案:

答案 0 :(得分:11)

我发现使用全局动作过滤器是处理这种跨领域/面向方面问题的最佳方式。

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

<QMessageBox>

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

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

答案 1 :(得分:2)

您使用的是DI容器吗?如果您要或者想要使用DI容器,可能会拦截对控制器的所有请求。这样你就不会改变数百个控制器中的代码,尽管只是简单的改变。

这里是Castle Windsor DI。

RuntimeException

如果您打算使用它,请查看the examples on this site。我确信有一种方法可以将它用于Web API和MVC控制器。