首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.NET MVC中实现精确的会话跟踪

在ASP.NET MVC中实现精确的会话跟踪
EN

Stack Overflow用户
提问于 2014-12-19 03:43:40
回答 1查看 5.1K关注 0票数 1

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

代码语言:javascript
复制
    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分钟。

代码语言:javascript
复制
    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路径: /blog 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测试,我们正在检测哪些页面在整个用户浏览周期中被触发,我们正在跟踪其他一些自定义信息,我们无法将这些信息放入google analytics API并从中提取这些信息。一旦他们浏览了网站,我们就会使用这些信息为网站上的每个会话建立用户配置文件。我们基本上需要检测这些会话中的哪些是真实的,并为网站所有者提供查看数据的能力,以及我们的数据挖掘应用程序来分析数据,并就某些标准向网站所有者提供反馈,以帮助他们从这些配置文件中改进网站。如果你有更好的办法,我们洗耳恭听。

EN

回答 1

Stack Overflow用户

发布于 2014-12-25 16:32:26

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

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

代码语言:javascript
复制
<configuration>
  <system.web>
    <anonymousIdentification enabled="true"/>
  </system.web>
</configuration>

一个更好的方法是添加一个全局mvc ActionFilterAttribute。生成的SessionId存储在httprequest中,由

代码语言:javascript
复制
filterContext.RequestContext.HttpContext.Request.AnonymousID

2)你应该创建一个跟踪路径的feed来异步分析它,甚至不是在同一个过程中。也许你想把跟踪记录“像服务器日志一样”存储在磁盘上,以便以后重新分析。

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

有时asp.net会话cookie不起作用,因为用户激活了一些非跟踪插件。Google Analytics在这里也会失败。您可以通过自定义ajax客户端回调来提高跟踪精度。要使Ajax回调在所有页面上全局发生,可以使用ActionFilterAttribute的帮助将一些脚本内容注入到html内容流响应的末尾。

将IPv4地址映射到会话可能会有所帮助,但这应该只是一个提示。现在很多互联网服务提供商都支持IPv6。大多数情况下,他们会将这些客户端映射到一个小的IPv4池。因此,一个用户可以非常快地切换其IPv4,并且同一页面的访问者很可能使用相同的ISP,因此共享一个ipv4。

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

但是有了Ajax回调,你可以验证浏览器的存在,至少是一个具有JavaScript环境的昂贵的html-dom的存在。

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

代码语言:javascript
复制
filters.Add(new OurTrackingActionFilterAttribute(ourTrackingService));

在过滤器覆盖OnActionExecuting中

代码语言:javascript
复制
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中创建一个“主题”,然后简单地将我们的跟踪对象推入其中。您可以编写观察器来传输、保存或处理跟踪对象。默认情况下,观察者一次只能获得一个对象,所以你不需要同步/锁定你的状态变量/Directory/memeory-cache,也许你想加载数据并在以后用你的应用程序的新版本重新处理它(可能是在调试中)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27554452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档