在ASP.NET MVC应用程序上记录用户活动

JOB*_*OBG 22 asp.net-mvc logging user-activity audit-trail audit-logging

是否有一个很好的策略来记录ASP MVC应用程序上的用户活动?(ActionFilters/HTTPModules).

像上次用户活动的东西(就像StackOverflow"23分钟前看到的那样"),甚至是使用的页面和控制器,并进一步推动了点击的按钮或链接.

我安装了ELMAH但据我所知它只是用于错误记录.

PD:谷歌分析不是一个选项.

Jay*_*Jay 45

动作过滤器属性非常适用于此,只需[YourAttributeName]在控制器顶部调用(或者如果您有其他控制器继承的应用程序控制器,您只需在应用程序中使用一次).

例如:

namespace the_name_space
{
    [Log]
    public class ApplicationController : Controller
    {
Run Code Online (Sandbox Code Playgroud)

从此时起,将在您的控制器中运行每个操作之前调用此属性,您也可以通过[Log]以相同方式在其之前调用来仅在操作上指定此属性.

为了得到你需要的日志记录功能,您将最有可能要重写OnResultExecutingOnResultExecuted,这两者都是非常自我解释.

例如:

public class LogAttribute : ActionFilterAttribute
{
    protected DateTime start_time;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        start_time = DateTime.Now;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        RouteData route_data = filterContext.RouteData;
        TimeSpan duration = (DateTime.Now - start_time);
        string controller = (string)route_data.Values["controller"];
        string action = (string)route_data.Values["action"];
        DateTime created_at = DateTime.Now;
        //Save all your required values, including user id and whatnot here.
        //The duration variable will allow you to see expensive page loads on the controller, this can be useful when clients complain about something being slow.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我担心使用这种方法你将无法确定点击了哪些按钮/链接.我不知道有什么方法直接从界面存储这些数据,但是如果所有按钮/链接都调用了一个动作,你可以通过这个方法中拾取的变量,不幸的是,这将是时间密集的,增加了你的所有链接.为此,传递"buttonClicked = name"并通过`filterContext.HttpContext.Request.RawUrl`变量访问它.不是最好的选择,并且只适用于向服务器发出请求的按钮. (2认同)

Len*_*rri 21

我只是偶然发现了Rion Williams的两篇帖子,这些帖子描述了一种非常简单的方法:

使用ASP.NET MVC ActionFilters实现审计跟踪

使用ASP.NET MVC中的ActionFilters创建高级审计跟踪

高级帖子非常棒,因为您可以存储请求的数据并进一步过滤该数据.

我现在将在我的应用程序中实现此功能.


Ror*_*ory 6

您可以尝试使用PostSharp方面为您执行日志记录,它的多播功能可能会派上用场.如果它不是一个选项,那么模块可能是最容易实现的(假设您可以在管道中的那一点获得所需的用户信息).