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

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

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

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

UserID

ActionTime

Controller 

Action

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

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

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

  2. 为所有存在的 Controller 实现一个基础Controller,如BaseController。并在 OnActionExecuting 中写入日志。然后将所有 Controller 更改为继承自 BaseController。 (如有不妥请指正,谢谢)

  3. 对于 ApiController。实现一个 DelegatingHandler 来实现它。

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

最佳答案

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

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

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

关于c# - 在 Asp.net MVC 和 Web API 中实现审计跟踪的干净方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773482/

相关文章:

asp.net-mvc - 无法加载文件或程序集 'System.Web.WebPages.Razor'?

c# - 如何注销 Owin 提供商?

c# - 故障排除 : Why doesn't type inference fail here?

c# - 正确使用迭代 block

asp.net-mvc - 如何检查 Razor View 中对象的类型?

asp.net-mvc - LINQ to Entity,使用 SQL LIKE 运算符

c# - 在 Getter Setter 中使用 Session 时发生堆栈溢出异常

entity-framework - 在一个 View 页面中同时显示两个局部 View

c# - 如何在 C# 中枚举本地化字母表?

c# - 如何在 DataGrid 中设置 DisplayMemberPath?