【问题标题】:Accurate Session Tracking in ASP.NET MVCASP.NET MVC 中的准确会话跟踪
【发布时间】:2014-12-18 19:43:40
【问题描述】:

每当用户点击我网站上的某个页面时,我都会运行以下代码来跟踪用户点击、页面浏览量、他们的去向等...

    public static void AddPath(string pathType, string renderType, int pageid = 0, int testid = 0)
    {

        UserTracking ut = (UserTracking)HttpContext.Current.Session["Paths"];

        if (ut == null)
        {
            ut = new UserTracking();
            ut.IPAddress = HttpContext.Current.Request.UserHostAddress;
            ut.VisitDate = DateTime.Now;
            ut.Device = (string)HttpContext.Current.Session["Browser"];

            if (HttpContext.Current.Request.UrlReferrer != null)
            {
                ut.Referrer = HttpContext.Current.Request.UrlReferrer.PathAndQuery.ToString();
                ut.ReferrerHost = HttpContext.Current.Request.UrlReferrer.Host.ToString();
                ut.AbsoluteUri = HttpContext.Current.Request.UrlReferrer.AbsoluteUri.ToString();
            }
        }

        //Do some stuff including adding paths

        HttpContext.Current.Session["Paths"] = ut;
    }

当会话结束时,我会在我的 Global.asax.cs 文件中存储该会话信息。当前会话超时设置为 20 分钟。

    protected void Session_End(object sender, EventArgs e)
    {            
        UserTracking ut = (UserTracking)Session["Paths"];

        if (ut != null)
            TrackingHelper.StorePathData(ut);
    }

问题是我没有得到准确的信息存储。例如,我在几分钟内就获得了数千个看起来像这样的会话存储。

会话 #1 时间:2014-10-21 01:30:31.990 路径:/博客 IP地址:54.201.99.134

会话 #2 时间:2014-10-21 01:30:31.357 路径:/blog-page-2 IP地址:54.201.99.134

它应该做的是只为这些实例存储一个会话:

会话应该是什么样子 时间:2014-10-21 01:30:31.357 路径:/blog,/blog-page-2 IP地址:54.201.99.134

显然,这似乎是搜索引擎抓取,但问题是,我不确定是否是这种情况。

1) 为什么会这样?

2) 我怎样才能获得准确的会话数以尽可能地匹配 Google 分析?

3) 如何排除机器人?或者如何检测是一个机器人触发了它?

编辑:很多人都在问“为什么” 对于那些问“为什么”的人,我们这样做而不是仅仅使用分析,长话短说,我们正在构建用户配置文件以从他们的配置文件中挖掘数据。我们正在查看他们正在查看的内容、查看时长、点击路径,我们还针对某些页面运行 A/B 测试,并且我们正在检测在整个用户查看周期中哪些页面正在触发,我们正在跟踪一些其他自定义信息,我们无法将其放入谷歌分析 API 并提取此信息。一旦他们浏览了网站,我们就会使用这些信息为网站上的每个会话建立用户配置文件。然后,我们基本上需要检测哪些会话实际上是真实的,并让网站所有者能够查看数据以及我们的数据挖掘应用程序以分析数据并就某些标准向网站所有者提供反馈,以帮助他们改善他们的网站从这些配置文件中。如果您有更好的方法来做到这一点,我们都会倾听。

【问题讨论】:

  • 您的具体问题是什么?如果是如何排除机器人,那么您要么必须在客户端 (JS) 上进行跟踪,要么识别并排除特定的 IP 范围或用户代理。
  • 你为什么还要这样做?可以从您的服务器日志中挖掘相同的信息,甚至更好的是,您可以使用 Google Analytics 之类的工具,它可以为您提供更详细和全面的统计信息。无论哪种方式都比您正在做的更准确,不需要任何额外的代码阻塞您的应用程序,并且不会受到会话超时等因素的影响。
  • 您根本不会在任何地方更新您的paths
  • “您的具体问题是什么?如果是如何排除机器人,那么您要么必须在客户端 (JS) 上进行跟踪,要么识别并排除特定的 IP 范围或用户代理。”是的,这本质上是一个问题,如果这确实是由机器人引起的。
  • 您为什么不为此使用分析包?它会更加可靠。 Session_End 不会被可靠地触发,并且永远不会。有很多情况会导致它无法触发,例如应用程序池回收。此外,它还会触发您不想要的机器人和其他流量。只需使用客户端分析工具,如谷歌分析或商业产品。如果您担心禁用 JavaScript 的人,请不要担心.. 现在几乎不可能在没有 javascript 的情况下运行。

标签: c# asp.net .net asp.net-mvc session


【解决方案1】:

1) 在 asp.net 会话 Cookie 的帮助下跟踪 asp.net 会话。 但它对匿名用户(未登录用户)禁用

您可以在 web.config 中为匿名用户激活 sessionId 创建

<configuration>
  <system.web>
    <anonymousIdentification enabled="true"/>
  </system.web>
</configuration>

一个更好的连接你的 takin 的地方是添加一个全局 mvc ActionFilterAttribute。 生成的SessionId存放在httprequest中,访问方式为

filterContext.RequestContext.HttpContext.Request.AnonymousID

2) 您应该创建跟踪路径的提要,以异步或不在同一进程中进行分析。也许您想将跟踪“像服务器日志一样”存储在磁盘上以便以后重新分析。

地理位置和数据库查找需要一些处理时间,而且您很可能无法从 IP 地址获得准确的地理位置。 更好的来源是稍后从用户配置文件/用户地址中获取。 (订单提交后)

有时 asp.net session cookie 不起作用,因为用户激活了一些 nottracking 插件。谷歌分析在这里也会失败。您可以使用自定义来提高跟踪准确性 ajax 客户端回调。 为了使所有页面的 Ajax 回调全局发生,您可以使用 ActionFilterAttribute 的帮助将一些 Script-Content 注入到 html 内容流响应的末尾。

将 IPv4 地址映射到会话会有所帮助,但这只是一个提示。 目前有很多 ISP 支持 IPv6。他们正在映射那里的客户 大部分时间到一个小的 IPv4 池。所以一个用户可以非常快速地切换它的 ipv4 并且同一页面的访问者很有可能使用相同的 ISP,因此共享 IPv4。

3) 大多数机器人通过请求标头中的自定义用户代理来识别自己。 有好有坏。见http://www.affiliatebeginnersguide.com/articles/block_bots.html

但是通过 Ajax 回调,你可以验证浏览器的存在,至少是代价高昂的存在 带有 JavaScript 环境的 html-dom。

X) 简化开始并专注于分析。实现一个简单的 ActionFilterAttribute 并在 RegisterGlobalFilters 中全局注册它

filters.Add(new OurTrackingActionFilterAttribute(ourTrackingService));

在过滤器中重写 OnActionExecuting

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        OnTrackingAction(filterContext);
    }

public virtual void OnTrackingAction(ActionExecutingContext filterContext)
    {
        var context = filterContext.RequestContext.HttpContext;

        var track = new OurWebTrack(context);

        trackingService.Track(track);
    }

为了不通过一些跟踪处理延迟服务器响应, 看看 Reactive 包http://msdn.microsoft.com/en-us/data/gg577609.aspx

这是将捕获与处理分开的好方法。

在 TrackingService 中创建一个“主题”,然后简单地将我们的跟踪对象推入其中。 您可以编写观察者来传输、保存或处理跟踪对象。 默认情况下,观察者一次只会得到一个对象,所以你不需要同步/锁定你的状态变量/目录/内存缓存,也许你想加载数据并在以后用你的应用程序的新版本重新处理它(可能在调试中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多