使用会话或替代方法记录访问者数据?

Log visitor data using sessions, or an alternative?

我什么都不用会话状态。我什至在 Web.config 中禁用了它,并删除了会话模块。但是,我现在需要记录访客数据,不知道如何做?

我想这样做:

但我宁愿不使用会话状态,除非我需要。我记得默认情况下会话是锁定的,这会减慢管道。

那么如何在没有会话状态的 ASP.NET MVC 中记录访问者数据?

您使用 ActionFilterAttribute

asp.net/mvc 网站上有一个方法:http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs

总而言之,添加一个class喜欢:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class LogVisitorsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var descriptor = filterContext.ActionDescriptor;
        var controller = descriptor.ControllerDescriptor.ControllerName;
        var action = descriptor.ActionName;
        var user = filterContext.HttpContext.User.Identity.Name;

        // add your logging here
        log(description, controller, action, user);
    }
}

您可以在 OnActionExecuting 期间提取各种有趣的 "visitor data",例如 controller/action 名称(如图所示)和传递给操作的值(操作参数)。

然后您可以将其添加到单个操作中

 [LogVisitors]
 public ActionResult Index()

或控制器(或基础控制器)

 [LogVisitors]
 public class HomeController

或通过将其添加到您的 FilterConfig(应该已经存在)来添加到所有操作和控制器

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new LogVisitorsAttribute());
    }
}

我想到了另外一个方法,但是很乱:

  • 截取 Application_BeginRequest() 方法 Global.asax
  • 将 cookie 与当前时间进行比较
  • 如果 >20 分钟则为新会话,否则使用当前时间戳更新 cookie
  • 如果新会话则执行日志记录

缺点:

  • 每个请求都会触发
  • 重新发明轮子 - 这基本上是会话状态!

优点:

  • 比会话状态更轻
  • 不锁定任何东西

希望有更好的方法,因为这看起来很乱。

So how do I log visitor data in ASP.NET MVC without session state?

简单的方法是,不要记录它。让第 3 方为您记录。您可以使用 Google Analytics or a paid service such as Hitslink 等免费服务来监控用户的一切,并有许多图表选项供以后分析数据。

这样您就不需要会话状态,不必担心数据的存储问题,也不必构建自己的报告解决方案来分析它。