Журнал активности пользователей в приложении ASP.NET MVC - PullRequest
22 голосов
/ 01 декабря 2009

Есть ли хорошая стратегия для регистрации активности пользователей в приложении ASP MVC? (ActionFilters / HTTPModules).

Что-то вроде последнего пользовательского действия (точно так же, как StackOverflow «Виден 23 минуты назад»), и даже какие страницы и контроллеры использовались, и еще больше подталкивает, какие кнопки или ссылки нажимались.

У меня установлен ELMAH, но, насколько я знаю, это только для регистрации ошибок.

PD: Google Analytics не вариант.

Ответы [ 4 ]

45 голосов
/ 01 декабря 2009

Предупреждение: это было написано в 2009 году для MVC .NET RC1 и может больше не быть синтаксически правильным.

Атрибуты фильтра действий идеально подходят для этого, просто вызовите [YourAttributeName] в верхней части вашего контроллера (или если у вас есть контроллер приложений, от которого наследуются другие контроллеры, он вам нужен только один раз в вашем приложении).

Например:

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

С этого момента этот атрибут будет вызываться до того, как каждое действие будет запущено в вашем контроллере (ах), вы также можете указать это только для действия, вызвав [Log] непосредственно перед ним тем же способом.

Чтобы получить необходимую вам функцию ведения журнала, вы, скорее всего, захотите переопределить OnResultExecuting и OnResultExecuted, оба из которых довольно понятны.

Например:

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.
    }
}
21 голосов
/ 29 мая 2013

Я только что наткнулся на эти 2 сообщения Рион Уильямс , которые описывают очень простой способ сделать это:

Реализация контрольных журналов с использованием ASP.NET MVC ActionFilters

Создание расширенных журналов аудита с использованием ActionFilters в ASP.NET MVC

Опытный пост действительно хорош, поскольку вы можете хранить данные запроса и дополнительно фильтровать эти данные.

Я реализую это прямо сейчас в моем приложении.

6 голосов
/ 01 декабря 2009

Вы можете попробовать использовать аспект PostSharp , чтобы выполнить регистрацию для вас, его функциональность многоадресной передачи может пригодиться для чего-то подобного. Если это не вариант, то модуль, вероятно, будет проще всего реализовать (при условии, что вы можете получить необходимую информацию о пользователе в этой точке конвейера).

2 голосов
/ 01 декабря 2009

@ Идея Рори превосходна. PostSharp - именно то, что вам нужно для этого, вы можете рассмотреть возможность его подключения к ASP.net Health Monitoring

...