ASP.NET MVC 3实现访问统计系统

运营网站,我们经常需要分析用户的行为、用户的习惯,用户看重网站的哪一部分,哪一部分是对用户有用的之类的信息,这些信息从哪里来,这时我们就需要用到访问统计系统了。 网上已经有很多的统计系统,如站长统计、百度统计、谷歌分析之类的,别人的东西始终是别人的,为什么我们不自己实现统计的功能呢,而且自己写的可以实现一些特殊的功能,如登录,下单行为,能够更好的融合自己的系统!

下面我们就用ASP.NET MVC 3来实现一个访问统计系统!首先,使用程序生成一段js代码,包括读写Cookie,及写入一个唯一值到Cookie中,用来判断独立访客者,再写入访问次数及上一个访问页面ID值;然后就是获取客户端时间,分辨率之类的。

string guid = Guid.NewGuid().ToString();
#region 生成js
html.Append("function WriteCookie(cookieName, cookieValue, expiry) {"); //js写cookie
html.Append(" var expDate = new Date();");
html.Append(" if (expiry) {");
html.Append(" expDate.setTime(expDate.getTime() + expiry);");
html.Append(" document.cookie = cookieName + \"=\" + escape(cookieValue) + \"; path=/;expires=\" + expDate.toGMTString();");
html.Append(" }");
html.Append(" else {");
html.Append(" document.cookie = cookieName + \"=\" + escape(cookieValue) + \"; path=/;\"");
html.Append(" }");
html.Append("}");
html.Append("function ReadCookie(name) {"); //js读取cookie
html.Append(" var cookieValue = \"\";");
html.Append(" var search = name + \"=\";");
 html.Append(" if (document.cookie.length >0) {");
html.Append(" offset = document.cookie.indexOf(search);");
html.Append(" if (offset != -1) {");
html.Append(" offset += search.length;");
html.Append(" end = document.cookie.indexOf(\";\", offset);");
html.Append(" if (end == -1)");
html.Append(" end = document.cookie.length;");
html.Append(" cookieValue = unescape(document.cookie.substring(offset, end))");
html.Append(" }");
html.Append(" }");
html.Append(" return cookieValue;");
html.Append("}");
html.Append("DateFormatString = function(datetime, format) {");
html.Append(" var year = datetime.getFullYear();");
html.Append(" var month = datetime.getMonth()+1;");
html.Append(" var date = datetime.getDate();");
html.Append(" var hour = datetime.getHours();");
html.Append(" var minutes = datetime.getMinutes();");
html.Append(" var second = datetime.getSeconds();");
html.Append(" format = format.replace(/YY/g, year).replace(/MM/g, month).replace(/DD/g, date).replace(/hh/g, hour).replace(/mm/g, minutes).replace(/ss/g, second);");
html.Append(" return format;");
html.AppendLine("}");
html.Append("var cookieEnabled = (navigator.cookieEnabled) ? true : false;"); //判断浏览器是否支持cookie
html.Append("if (typeof navigator.cookieEnabled == \"undefined\" &&!cookieEnabled) {");
html.Append(" document.cookie = \"testcookie\";");
html.Append(" cookieEnabled = (document.cookie == \"testcookie\") ? true : false;");
html.Append(" document.cookie = \"\";");
html.Append("}");
html.Append("var firstshow;");
html.Append("var visittotal;");
 html.Append("var isLogin;");
html.Append("var loginName;");
html.Append("if (cookieEnabled == true) {");
html.Append(" var HBCountShowCookie = ReadCookie(\"HBCountShowCookie\");"); //访客浏览器唯一ID
html.Append(" var HBCountVisitTotalCookie = ReadCookie(\"HBCountVisitTotalCookie\");"); //访客浏览次数
html.Append(" var HBClientIDCookie = ReadCookie(\"HBClientIDCookie\");"); //访客上一个点击页面ID
html.Append(" var HBLoginNameCookie = ReadCookie(\"HBLoginNameCookie\");"); //记录登录的用户名
html.Append(" if (HBCountShowCookie == \"\") {");
html.Append(" sparetime = 1000 * 60 * 60 * 24 * 3650;"); //有效期为一年
html.Append(" WriteCookie('HBCountShowCookie', \"" + guid + "\", sparetime);");
html.Append(" HBCountShowCookie = ReadCookie(\"HBCountShowCookie\");");
html.Append(" firstshow = 1;");
html.Append(" }");
html.Append(" else {");
html.Append(" firstshow = 0;");
html.Append(" }");
html.Append(" if (HBCountVisitTotalCookie == \"\") {"); //游客统计
html.Append(" sparetime = 1000 * 60 * 60 * 24 * 3650;");
html.Append(" WriteCookie('HBCountVisitTotalCookie', 1, sparetime);");
html.Append(" visittotal = 1;");
html.Append(" }");
html.Append(" else {");
html.Append(" if (firstshow == 1) {");
html.Append(" visittotal = parseInt(HBCountVisitTotalCookie) + 1;");
html.Append(" sparetime = 1000 * 60 * 60 * 24 * 3650;");
html.Append(" WriteCookie('HBCountVisitTotalCookie', visittotal, sparetime);");
html.Append(" }");
html.Append(" else {");
html.Append(" visittotal = parseInt(HBCountVisitTotalCookie);");
html.Append(" }");
html.Append(" }");
html.Append(" try {");
html.Append(" if (HBStat != undefined || HBStat.isLogin != undefined || HBStat.loginName != undefined) {"); //此为登录用户统计
html.Append(" if (HBStat.isLogin == 1 &&HBStat.loginName != \"\") {");
html.Append(" sparetime = 1000 * 60 * 60 * 24 * 120;");
html.Append(" WriteCookie('HBLoginNameCookie', HBStat.loginName, sparetime);");
html.Append(" HBLoginNameCookie = ReadCookie(\"HBLoginNameCookie\");");
html.Append(" }");
html.Append(" isLogin=HBStat.isLogin;");
html.Append(" }");
html.Append(" else{isLogin=0;}");
html.Append(" }");
html.Append(" catch (e) { isLogin=0; }");
html.Append(" loginName=HBLoginNameCookie;");
html.Append("} else {"); //不支持cookie
html.Append(" firstshow = 0;");
html.Append(" visittotal = 1;");
 html.Append(" var HBCountShowCookie = \"\";");
html.Append(" isLogin=0;");
html.Append(" loginName=\"\";");
html.Append("}");
html.Append("var ly = escape(document.referrer);");
html.Append("var currweb = escape(location.href);");
html.Append("var d = new Date();");
html.Append("var currdate=DateFormatString(d,'YY-MM-DD hh:mm:ss');");
html.Append("var screenwidth=screen.width;");
html.Append("var screenheight=screen.height;");
html.Append("var screencolordepth=screen.colorDepth;");
html.Append("document.write('<script src=\"" + websiteUrl + "CountGet/?SiteID=" + SiteID + "&assort=" + assort + "&isLogin='+isLogin+'&loginName='+loginName+'&FirstShow='+firstshow+'&VisitTotal='+visittotal+'&Ly='+ly+'&CurrWeb='+currweb+'&cookid='+HBCountShowCookie+'&screenwidth=' + screenwidth + '&screenheight=' + screenheight + '&screencolordepth=' + screencolordepth + '&currdate='+currdate+'&ranstr=' + Math.random() + '\"></script>');");
#endregion 

生成之后再去执行下一个Action,用来写入一些统计数据,如客户端IP,浏览器信息,访问页面来源,当前页、访问时间、离开时间等!根据上一个访问页面地址、当前地址及上一个访问页面ID来判断是否是刷新操作还是新的访问页面,如果是刷新操作则写入刷新时间,否则写入上一个页面的离开时间,由于js的跨域问题,

if (assort.Equals(0))
{
ly = Request.QueryString["Ly"]; //获取来源URL
currWeb = Request.QueryString["CurrWeb"]; //获取当前URL
}
else
{
ly = Request.ServerVariables["Http_Referer"];
currWeb = ly;
}
string firstShow = Request.QueryString["FirstShow"]; //是否第一次访问
string visitTotal = Request.QueryString["VisitTotal"]; //获取浏览次数
string ip = Helper.Utils.ClientIP(); //获取客户端IP地址
string strAgent = Request.ServerVariables["HTTP_USER_AGENT"];
bool isAlexa = false;
if (strAgent.IndexOf("alexa") >-1) //判断是否安装alexa工具栏
isAlexa = true;
string browerName = Request.Browser.Browser; //浏览器名称
string browerVersion = Request.Browser.Version; //浏览器版本
string os = Helper.Utils.GetClientOS(); //客户端操作系统
string langage = Helper.Utils.GetLangage(); //客户端语言
string spider = Helper.Utils.GetSpiderBot(); //搜索引擎爬虫信息
bool isSpider = false;
if (!string.IsNullOrEmpty(spider))
isSpider = true;
HttpContext.Application.Lock();
ClickDataAccess clientBasic = new ClickDataAccess();
 //刷新操作 需要根据上一个地址和当前地址 来判断
if (HttpContext.Application["HBCurrWeb_" + SiteID] != null
&&HttpContext.Application["HBCurrWeb_" + SiteID].ToString().Equals(currWeb)
&&HttpContext.Application["HBLy_" + SiteID] != null
&&HttpContext.Application["HBLy_" + SiteID].ToString().Equals(ly)
&&HttpContext.Application["HBClientId_" + SiteID] != null)
{
clientBasic.UpdateForRefresh(HttpContext.Application["HBClientId_" + SiteID]);
//Helper.Utils.CreateFile("~/Log/", DateTime.Now.ToString("yyyyMMddHHmmssffff") + "_" + SiteID + "刷新.txt", writetext.ToString());
}
else
{
if (HttpContext.Application["HBClientId_" + SiteID] != null) //如果存在上一个页面的ID值则写入离开时间
clientBasic.UpdateForLeaveTime(HttpContext.Application["HBClientId_" + SiteID]);
ClickAndVisitorsDataAccess clientData = new ClickAndVisitorsDataAccess();
string[] outParam = clientData.Save(client);
if (!string.IsNullOrEmpty(outParam[0]))
HttpContext.Application["HBPublicId_" + SiteID] = outParam[0];
if (!string.IsNullOrEmpty(outParam[1]))
{
HttpContext.Application["HBClientId_" + SiteID] = outParam[1];
javaScript = "WriteCookie('HBClientIDCookie'," + int.Parse(outParam[1]) + ");";
}
HttpContext.Application["HBCurrWeb_" + SiteID] = currWeb;
HttpContext.Application["HBLy_" + SiteID] = ly;
}
HttpContext.Application.UnLock();
#endregion 

这里使用Application来存储对象,当然也可以使用缓存类来做.

暂时没有解决离开当前网站时的离开时间,当然如果访问统计系统的域名和被统计的网站域名是同一个顶级域名,则可以做到这点!

访问统计系统的后台使用存储过程来统计分析数据,暂时只写了一部分功能,仅供大家学习参考!

(0)

相关推荐

  • ASP.NET Mvc开发之EF延迟加载

    先来看看定义 EF延迟加载:就是使用Lamabda表达式或者Linq 从 EF实体对象中查询数据时,EF并不是直接将数据查询出来,而是在用到具体数据的时候才会加载到内存. 一.实体对象的Where方法返回一个什么对象? 大家来看一下上一篇文章的代码来分析一下: #region 查询文章列表+ActionResult Article() /// <summary> /// 查询文章列表 /// </summary> /// <returns></returns>

  • windows2003 IIS6 部署MVC3和MVC4程序的方法

    1.服务器上安装SP2 和 IIS6 2.安装.Net Framework3.5 SP1(完整安装包,包含2.0 2.0SP1,237MB那个安装包http://www.jb51.net/softs/75472.html) 3.安装.Net Framework4.0 http://www.jb51.net/softs/25944.html 4.安装WindowsServer2003-KB968930-x86-CHS.exe,PowerShell 2.0的补丁(下载地址:http://www.mi

  • ASP.NET Mvc开发之查询数据

    对于.NET平台上开发WebForm项目,程序员操作数据的方法主要是通过使用ADO.NET.而我们MVC操作数据库呢?与ADO.NET相比又有怎样的优势呢? 一.大家都在谈的EF到底是什么? EF,全称EntityFramWork.就是微软以ADO.NET为基础发展的所谓ORM(对象关系映射框架,或者说是数据持久化框架). 简单的来说就是根据实体对象操作数据表中数据的一种面向对象的操作框架,具体的底层也是调用ADO.NET. 下面我们就来演示怎么使用EF来操作数据库: 在数据库关系图中,表之间的

  • 初识ASP.NET Mvc5+EF7的奇妙之旅

    话说今年微软是很给力的,Win10算是吸引了大众的眼球了,而最新的.NET5框架更是OK. 最新的.NET5进行了开源,同时利用NuGet以及Node和Bower进行了跨平台化:这意味这可以直接在Mac或者Linux上使用.NET进行开发. 而最新的Mvc5和EF框架也算是进行了换脸了,跟之前Mvc4的项目都不一样,如果进行移植除了核心代码可以拷贝过来,其他的统统要重新来过. 最近准备改版一下网站,所以尝试了一把最新的框架:当然由于现在还是预览版所以改动什么的都超大,所以也走了不少弯路:特在此记

  • ASP.NET MVC中图表控件的使用方法

    微软发布了一个强大的ASP.NET的图表控件,支持丰富的图表选项设置-包括列,点,泡沫,饼图,圆环图,金字塔,漏斗,盒形图,面积,范围,AJAX的互动,以及更多.Microsoft图表控件示例项目包括ASP.NET页的图表样本超过200个.在这篇文章中,我将展示如何在ASP.NET MVC中使用图表控件. 这里介绍一个非常简单的项目,显示了一个类的结果比较.两个字段 - ID(这是唯一的一个学生)和GPA(平均成绩) - 代表一个特定的学生的结果.各种图表结果显示,学生的结果进行比较.我希望把重

  • ASP.NET MVC中HtmlHelper控件7个大类中各个控件使用详解

    HtmlHelper类在命令System.Web.Mvc.Html之中,主要由7个静态类组成,它们分别是FormExtensions类,InputExtensions类,LinkExtensions类,SelectExtensions类,TextExtensions类,ValidationExtensions类,RenderPartialExtensions类. 为了方便开发者使用HtmlHelper控件,在视图ViewPage类中设置了一个属性Html它就是HtmlHelper类型. 一.Fo

  • asp.net 图片验证码的HtmlHelper

    一个图片验证码的HtmlHelper,原来的调用代码如下: 复制代码 代码如下: <img id="validateCode" mailto:src='@Url.Action(%22GetValidateCode%22)'/> <script language="javascript" type="text/javascript"> $(document).ready(function () { $("#vali

  • 实现Asp.net mvc上传头像加剪裁功能

    在我们使用QQ上传头像,注册用户账号时是不是都会遇到上传图像,并根据自己的要求对图像进行裁剪,这是怎么实现的呐? 本文主要介绍了Asp.net mvc实现上传头像加剪裁功能,分享给大家供大家参考.具体如下: 运行效果截图如下: 具体代码如下: 前台代码 <link href="~/Content/fineuploader.css" rel="stylesheet" /> <link href="~/Content/jquery.Jcrop

  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    现在的大部分框架都是 MVC 模式,但 MVC 三个部分怎么配合,这里做了一点总结: 基本原则:业务逻辑代码应该写在 M 里面,而应用程序逻辑应该写在 C 里面.V 只是单纯的展示数据. 举个简单例子吧:用户往购物车添加一个商品 用户点击商品的"添加到购物车"按钮,引起一次请求.服务器开始处理该请求,过程: 1.检查当前用户是否有权限(比如是否已经登录.用户帐户状态.是否可以购物等) 2.检查要添加的商品ID是否有效. 3.检查要添加的商品库存是否足够 4.将商品加入购物车,并保存购物

  • ASP.NET Mvc开发之删除修改数据

    之前那篇文章介绍了ASP.NET MVC使用EF来查询数据和EF中DbQuery<T>泛型对象对数据的延迟加载.今天我们就来看看我们怎么使用EF来删除数据. 其实现在的Web开发通用的模式就是前端使用Js和JQuery来和后端进行数据交互.那么我们就在前端来加两个删除和更新的脚本.代码如下: <!--遍历 Action方法 设置给 ViewData 的集合数据,生成HTML代码--> @foreach (BlogArticle a in ViewData["DataLis

随机推荐