使用会话或其他方式记录访问者数据?

时间:2015-09-18 09:29:59

标签: asp.net asp.net-mvc session-state

我没有使用会话状态。我甚至在Web.config中禁用了它,并删除了会话模块。但是,我现在需要记录访问者数据,而不知道如何?

我虽然这样做:

  • 重新启用会话
  • void Session_Start(object, EventArgs)
  • 中的Global.asax方法中捕获新会话
  • 记录感兴趣的东西

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

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

2 个答案:

答案 0 :(得分:1)

您使用ActionFilterAttribute

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

总之,添加一个类:

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

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

 [LogVisitors]
 public ActionResult Index()

或控制器(或基本控制器)

 [LogVisitors]
 public class HomeController

或将所有操作和控制器添加到FilterConfig(应该已存在)

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

答案 1 :(得分:0)

我想到了另一种方式,但它太乱了:

  • 拦截Application_BeginRequest()
  • 中的Global.asax方法
  • 将Cookie与当前时间进行比较
  • 如果> 20分钟,那么它就是新会话,否则用当前时间戳更新cookie
  • 如果新会话然后执行记录

缺点:

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

优点:

  • 比会话状态轻?
  • 没有锁定任何东西

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