FAt*_*oon 1 .net c# asp.net asp.net-mvc session
每当用户点击我网站上的页面时,我都会运行以下代码来跟踪用户点击,页面浏览量,他们去哪里等等......
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;
}
Run Code Online (Sandbox Code Playgroud)
在会话结束时的Global.asax.cs文件中,我存储了该会话信息.当前会话超时设置为20分钟.
protected void Session_End(object sender, EventArgs e)
{
UserTracking ut = (UserTracking)Session["Paths"];
if (ut != null)
TrackingHelper.StorePathData(ut);
}
Run Code Online (Sandbox Code Playgroud)
问题是我没有准确存储信息.例如,我在几分钟内收到了数以千计的会话商店.
会议#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测试,并且我们正在检测哪些页面在整个用户查看周期中触发,我们是跟踪一些其他自定义信息,我们无法将其放入Google Analytics API并将此信息提取出来.一旦他们浏览了网站,我们就可以使用这些信息为网站上的每个会话构建用户配置文件.我们基本上需要检测哪些会话实际上是真实的,并让网站所有者能够查看数据以及我们的数据挖掘应用程序来分析数据并根据某些标准向网站所有者提供反馈,以帮助他们改进网站从这些配置文件.如果你有更好的方法,我们都会听到.
1)在asp.net会话Cookie的帮助下跟踪asp.net会话.但是对于匿名用户(未登录用户)禁用
您可以在web.config中为匿名用户激活sessionId创建
<configuration>
<system.web>
<anonymousIdentification enabled="true"/>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
连接你的粘性的一个更好的地方是添加一个全局的mvc ActionFilterAttribute.生成的SessionId存储在httprequest中,由访问者访问
filterContext.RequestContext.HttpContext.Request.AnonymousID
Run Code Online (Sandbox Code Playgroud)
2)你应该创建一个跟踪路径的源,以便在同一个过程中同步或不分析它.也许您希望将跟踪存储在磁盘上"就像服务器日志",以便稍后重新分析它.
地理位置和数据库查找需要一些处理时间,而且最不可能的是,您无法从IP地址获得准确的地理位置.更好的来源是稍后从用户配置文件/用户地址获取它.(订单提交后)
有时asp.net会话cookie不起作用,因为用户有一些notracking插件被激活.Google Analytics也会失败.您可以使用自定义ajax客户端回调来提高跟踪准确性.要使Ajax回调在所有页面上全局发生,您可以使用ActionFilterAttribute的帮助将一些脚本内容注入到html内容流Response的末尾.
将IPv4地址映射到会话可能有所帮助,但它应该只是一个提示.很多ISP支持IPv6.他们大多数时间将客户端映射到一个小型IPv4池.因此,一个用户可以非常快速地切换其ipv4,并且同一页面的访问者很可能使用相同的ISP并因此共享IPv4.
3)大多数机器人通过请求标头中的自定义用户代理标识自己.有好有坏.请访问http://www.affiliatebeginnersguide.com/articles/block_bots.html
但是使用Ajax回调,你可以验证浏览器的呈现,至少是一个带有JavaScript环境的代价高昂的html-dom.
X)简化开始并专注于分析.实现一个简单的ActionFilterAttribute并在RegisterGlobalFilters中将其注册为globaly
filters.Add(new OurTrackingActionFilterAttribute(ourTrackingService));
Run Code Online (Sandbox Code Playgroud)
在过滤器覆盖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);
}
Run Code Online (Sandbox Code Playgroud)
若要不通过某些跟踪处理来延迟服务器响应,请查看Reactive包http://msdn.microsoft.com/en-us/data/gg577609.aspx
这是将捕获从处理中分离出来的好方法.
在TrackingService中创建一个"主题",然后将跟踪对象简单地推入其中.您可以编写观察者来传输,保存或处理跟踪对象.默认情况下,观察者一次只能获得一个对象,因此您不需要同步/锁定状态变量/目录/记忆缓存,也许您希望加载数据并在以后使用新版本的应用程序重新处理它(也许在调整中).
| 归档时间: |
|
| 查看次数: |
4342 次 |
| 最近记录: |