Asp.net 使用会话或其他方式记录访客数据?

Asp.net 使用会话或其他方式记录访客数据?,asp.net,asp.net-mvc,session-state,Asp.net,Asp.net Mvc,Session State,我什么都不使用会话状态。我甚至在我的Web.config中禁用了它,并删除了会话模块。但是,我现在需要记录访客数据,不知道如何记录 我想这样做: 重新启用会话 在void Session\u Start(object,EventArgs)方法的Global.asax中捕获新会话 感兴趣的原木 但我宁愿不使用会话状态,除非我需要。我记得会话在默认情况下是锁定的,这会减慢管道的速度 那么,在没有会话状态的情况下,如何在ASP.NET MVC中记录访问者数据呢 在asp.net/mvc站点上有一个

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

我想这样做:

  • 重新启用会话
  • void Session\u Start(object,EventArgs)
    方法的
    Global.asax中捕获新会话
  • 感兴趣的原木
但我宁愿不使用会话状态,除非我需要。我记得会话在默认情况下是锁定的,这会减慢管道的速度

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

在asp.net/mvc站点上有一个操作方法:

总之,添加一个类,如:

[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);
    }
}
您可以在执行操作期间提取各种有趣的“访问者数据”,例如控制器/操作名称(如图所示)和传递给操作的值(操作参数)

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

 [LogVisitors]
 public ActionResult Index()
或控制器(或基本控制器)

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


我想了另一种方法,但很混乱:

  • Global.asax中的
    Application\u BeginRequest()方法中拦截
  • 将cookie与当前时间进行比较
  • 如果>20分钟,则为新会话,否则使用当前时间戳更新cookie
  • 如果是新会话,则执行日志记录
缺点:

  • 为每一个请求开火
  • 重新发明轮子-这基本上是会话状态
优点:

  • 比会话状态轻
  • 没有锁任何东西
希望有更好的方法,因为这看起来很混乱

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

简单的方法是,不要记录它。让第三方为您记录。您可以使用免费服务(如)或付费服务(如)来监控用户的所有信息,并且有许多图表选项可供以后分析数据


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

您所说的
记录访客数据是什么意思?@RubensFarias通常。。。IP、推荐人等。这是一个聪明的方法。但它会为每一个请求开火。我如何“每次”只做一次?是的,我知道这听起来有多讽刺!:)事实上,如果你把这个方法和我在回答中详述的方法结合起来,那么这是一个很好的组合。因此,我只需要在您的
操作执行中添加cookie逻辑。我不知道具体细节,但您通过减少服务器端处理来增加带宽/客户端开销。我发现有一个答案值得一读:饼干会很小。。。只包含一个时间戳。开销将是在每个请求上运行此操作筛选器,相比之下,cookie处理是最小的。如果您只需要基本数据,那么滚动您自己的数据是有意义的。但我很欣赏这一评论,这可能适用于许多大型网站。
 [LogVisitors]
 public class HomeController
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new LogVisitorsAttribute());
    }
}