【问题标题】:Log User Activity on ASP.NET MVC Application在 ASP.NET MVC 应用程序上记录用户活动
【发布时间】:2010-12-21 19:40:53
【问题描述】:

是否有在 ASP MVC 应用程序上记录用户活动的好策略? (ActionFilters/HTTPModules)。

类似于上次用户活动(就像 StackOverflow“23 分钟前看到的”),甚至使用了哪些页面和控制器,甚至进一步推动了点击了哪些按钮或链接。

我安装了 ELMAH,但据我所知,它仅用于错误记录。

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

【问题讨论】:

    标签: asp.net-mvc logging audit-trail audit-logging user-activity


    【解决方案1】:

    警告:这是 2009 年为 MVC .NET RC1 编写的,在语法上可能不再正确。

    Action Filter Attributes 非常适合此操作,只需在控制器顶部调用[YourAttributeName](或者,如果您有一个其他控制器继承自的应用程序控制器,您只需在应用程序中使用一次)。

    例如:

    namespace the_name_space
    {
        [Log]
        public class ApplicationController : Controller
        {
    

    从此时起,该属性将在您的控制器中运行每个操作之前被调用,您也可以通过以相同方式在它之前调用[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.
        }
    }
    

    【讨论】:

    • 看起来还不错。但是对于单击的按钮和链接也会起作用吗?其想法是,设计人员使用此统计信息来决定哪些按钮或链接被更多使用,哪些未被事件点击。
    • 恐怕使用这种方法您将无法确定单击了哪些按钮/链接。我不知道直接从界面存储这些数据的任何方式,但是如果所有按钮/链接都调用一个动作,你可以通过一个在这个方法中拾取的变量,不幸的是,这将是时间密集的添加到你的所有链接。为此,请传递“buttonClicked=name”并通过the filterContext.HttpContext.Request.RawUrl 变量访问它。虽然不是最好的选择,并且仅适用于向服务器发出请求的按钮。
    • 可能无法获取点击了哪些按钮或链接,但我认为您可以通过 ResultExecutedContext 获取引用 URL?
    • 如果它正在与服务器建立连接,您可以传递单击的按钮名称,但如上所述,实际上这样做会非常可怕。正如 Kenny Eliasson 所说,使用引用 URL 找出链接被点击的位置要好得多,我不确定 ResultExecutedContext 是否在我的脑海中,但会有一种方法可以做到这一点。好主意肯尼
    • 你能从这个动作中得到发布的数据吗?例如,如果我将其添加到 AddComment 操作中,我能否获得添加的评论的 ID、文本...?
    【解决方案2】:

    我偶然发现了Rion Williams 的这 2 篇帖子,它们描述了一种非常简单的方法:

    Implementing Audit Trails using ASP.NET MVC ActionFilters

    Creating Advanced Audit Trails using ActionFilters in ASP.NET MVC

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

    我现在将在我的应用中实现这一点。

    【讨论】:

    • 非常有用,现已在我的应用中实现,感谢您提供的链接。
    • @JonL 你自定义实现了吗?
    【解决方案3】:

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

    【讨论】:

    • PostSharp 能否以不显眼的方式定位操作方法?我认为它需要属性装饰,我知道我的 MVC 操作方法有点重。一旦你达到 4-5 个属性,我认为事情会变得很糟糕。
    • 这正是我对使用 http 模块的担忧,我不知道我是否能够在这种情况下获得所需的数据。
    • 谷歌快速搜索返回了vyrotek.com/2008/using-postsharp-with-aspnet-mvc,这似乎很有希望。代码我还没看,不过说不定两个框架一起用还是可以的。
    • @jfar PostSharp 允许使用“多播”进行不显眼的装饰。在缩小哪些方面适用于哪些方法方面涉及少量工作,但它确实使控制器更清洁:postsharp.net/blog/post/multicasting-of-custom-attributes
    【解决方案4】:

    @Rory 的想法很棒。 PostSharp 正是您所需要的,您可以考虑将其与 ASP.net Health Monitoring 耦合

    【讨论】:

    • 我在看 PostSharp,它看起来很有趣,我只是想知道它是否需要像 log4net 这样的大量配置,或者像 ELMAH 这样非常简单。
    • 配置,没有。但是,它不仅仅用于日志记录,因此您必须采用自己的方法。
    • LAOS(PostSharp 附带的 AOP 框架)旨在处理各种横切关注点,日志恰好是其中之一(并且可能是最常用的示例)。唯一可能有问题的是后处理器注入的拦截代码。正如 jfar 对我的回答所评论的那样,它可能会导致 MVC 框架做事的方式出现问题,老实说,我不知道它们是否会一起工作。我建议你看一些例子并在网上搜索一下,看看有没有其他人成功地一起使用它们。
    • 我已经同时使用了 postsharp 和 MVC 没有问题。
    猜你喜欢
    • 2013-09-23
    • 2010-11-01
    • 2011-09-01
    • 2014-02-28
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多