使用会话或替代方法记录访问者数据?
Log visitor data using sessions, or an alternative?
我什么都不用会话状态。我什至在 Web.config
中禁用了它,并删除了会话模块。但是,我现在需要记录访客数据,不知道如何做?
我想这样做:
- 重新启用会话
- 在
void Session_Start(object, EventArgs)
方法中捕获新会话 Global.asax
- 记录感兴趣的内容
但我宁愿不使用会话状态,除非我需要。我记得默认情况下会话是锁定的,这会减慢管道。
那么如何在没有会话状态的 ASP.NET MVC 中记录访问者数据?
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 等免费服务来监控用户的一切,并有许多图表选项供以后分析数据。
这样您就不需要会话状态,不必担心数据的存储问题,也不必构建自己的报告解决方案来分析它。
我什么都不用会话状态。我什至在 Web.config
中禁用了它,并删除了会话模块。但是,我现在需要记录访客数据,不知道如何做?
我想这样做:
- 重新启用会话
- 在
void Session_Start(object, EventArgs)
方法中捕获新会话Global.asax
- 记录感兴趣的内容
但我宁愿不使用会话状态,除非我需要。我记得默认情况下会话是锁定的,这会减慢管道。
那么如何在没有会话状态的 ASP.NET MVC 中记录访问者数据?
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 等免费服务来监控用户的一切,并有许多图表选项供以后分析数据。
这样您就不需要会话状态,不必担心数据的存储问题,也不必构建自己的报告解决方案来分析它。