asp.net 访问页面访问统计实现 for iis7
上一篇博文中《 asp.net 访问页面访问统计实现 》 中在win10 (iis8+)上运行没有问题,
但客户机子是windows server 2008 的 iis7弄死不对,最好加
<system.web>...<customErrors mode="Off"/>...</system.web>
把问题找到了!
1、_Cache = new System.Web.Caching.Cache(); (iis7不支持)
_Cache = HttpContext.Current.Cache;(更改为)
2、System.Timers.Timer(iis7触发不到事件)
System.Threading.Timer(更改为)
0x01、核心代码(更改为):
1、实现Http拦截操作,核心代码就是这一个了:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using System.Xml; namespace HYSWare.Web
{
public class CurVisitCount {
public DateTime BeginTime{get;set;}
public int Count { get; set; }
} public class RequestHandler : IHttpModule
{
private static System.Threading.Timer timer1;
private static System.Web.Caching.Cache _Cache;
private int _IntervalMinute; public int IntervalMinute
{
get
{
string _IntervalMinuteStr = ConfigurationManager.AppSettings["IntervalMinute"]; if (string.IsNullOrEmpty(_IntervalMinuteStr))
{
_IntervalMinute = ;
}
else
{
_IntervalMinute = Convert.ToInt32(_IntervalMinuteStr);
} return _IntervalMinute;
}
} public RequestHandler()
{
if (_Cache == null)
{
_Cache = HttpContext.Current.Cache;// new System.Web.Caching.Cache();
}
if (timer1 == null)
{
var autoEvent = new AutoResetEvent(false);
timer1 = new Timer(p => FlushData(), autoEvent, , IntervalMinute * ); //timer1 = new System.Timers.Timer(IntervalMinute * 60000);
//timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);
//timer1.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
//timer1.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
} if (_Cache["CurVisitCount"]==null)
_Cache["CurVisitCount"] = new CurVisitCount { BeginTime = DateTime.Now, Count = };
if (_Cache["VisitCount"] == null)
_Cache["VisitCount"]="";
} void IHttpModule.Dispose()
{
} void IHttpModule.Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
//context.EndRequest += new EventHandler(context_EndRequest);
} void context_BeginRequest(object sender, EventArgs e)
{
string[] requestEx = { ".aspx",".htm", ".html"}; HttpApplication application = (HttpApplication)sender;
var curRequest = application.Context.Request;
if (requestEx.Contains(curRequest.CurrentExecutionFilePathExtension)) {
if (_Cache["CurVisitCount"] == null)
_Cache["CurVisitCount"]=new CurVisitCount { BeginTime = DateTime.Now, Count = };
CurVisitCount curVisitCount = (CurVisitCount)_Cache["CurVisitCount"];
if (curVisitCount.BeginTime.Year + curVisitCount.BeginTime.Month < DateTime.Now.Year + DateTime.Now.Month)
{
UpdateVisitCount(curVisitCount.BeginTime);
curVisitCount = (CurVisitCount)_Cache["CurVisitCount"];
}
curVisitCount.Count += ;
_Cache["CurVisitCount"] = curVisitCount; if (_Cache["VisitCountXml"] == null)
_Cache["VisitCountXml"] = GetVisitCountInXml();
int visitCountXml = ;
int.TryParse(_Cache["VisitCountXml"].ToString(),out visitCountXml); _Cache["VisitCount"] = (visitCountXml + curVisitCount.Count).ToString(); }
//application.Context.Response.Write("自定义ModuleRequest开始");
} private int GetVisitCountInXml()
{
int ret = ;
string _VisitPath = AppDomain.CurrentDomain.BaseDirectory + "App_Data\\Xml\\VisitCountData.xml";
XmlDocument doc = new XmlDocument();
if (File.Exists(_VisitPath))
{
doc.Load(_VisitPath);
var curNode = doc.SelectNodes("//Visit");
foreach (XmlNode m in curNode) {
var countAttr = m.Attributes.GetNamedItem("VCount");
int v = ;
int.TryParse(countAttr.Value, out v);
ret += v;
}
}
return ret;
} private void UpdateVisitCount(DateTime time)
{
if (_Cache["CurVisitCount"] == null)
_Cache["CurVisitCount"]= new CurVisitCount { BeginTime = DateTime.Now, Count = };
CurVisitCount curVisitCount = (CurVisitCount)_Cache["CurVisitCount"];
if (curVisitCount.Count > )
{
string _VisitPath = AppDomain.CurrentDomain.BaseDirectory + "App_Data\\Xml\\VisitCountData.xml";
XmlDocument doc = new XmlDocument(); if (File.Exists(_VisitPath))
{
doc.Load(_VisitPath);
var curNode = doc.SelectSingleNode(string.Format("//Visit[@Year='{0}' and @Month='{1}']", time.Year, time.Month));
if (curNode != null)
{
var countAttr = curNode.Attributes.GetNamedItem("VCount");
int count = ;
int.TryParse(countAttr.Value, out count);
countAttr.Value = (count + curVisitCount.Count).ToString();
}
else
{
//有文件但没有本月数据
XmlNode root = doc.SelectSingleNode("Visits");
XmlElement element1 = doc.CreateElement("Visit");
element1.SetAttribute("Year", time.Year.ToString());
element1.SetAttribute("Month", time.Month.ToString());
element1.SetAttribute("VCount", curVisitCount.Count.ToString());
root.AppendChild(element1);
}
}
else
{
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(dec); //创建一个根节点(一级)
XmlElement root = doc.CreateElement("Visits");
doc.AppendChild(root);
//创建节点(二级)
XmlElement element1 = doc.CreateElement("Visit");
element1.SetAttribute("Year", time.Year.ToString());
element1.SetAttribute("Month", time.Month.ToString());
element1.SetAttribute("VCount", curVisitCount.ToString());
root.AppendChild(element1);
}
doc.Save(_VisitPath); _Cache["VisitCountXml"] = GetVisitCountInXml();
_Cache["VisitCount"] = _Cache["VisitCountXml"];
_Cache["CurVisitCount"] = new CurVisitCount { BeginTime = DateTime.Now, Count = };
}
} void FlushData()
{
UpdateVisitCount(DateTime.Now);
} //private void timer1_Tick(object sender, EventArgs e)
//{
// UpdateVisitCount(DateTime.Now);
//}
}
}
asp.net 访问页面访问统计实现 for iis7的更多相关文章
- asp.net 访问页面访问统计实现
0x00.背景: 1.用户访问网站所有页面就将访问统计数加1 ,按每月存放. 2.站点并没有用到母版面来实现,所有各个页面都很独立. 3.网站是很早这前的网站,尽量省改动以前的代码.按理说我们应该做一 ...
- ASP.NET 数据库页面访问简单工具
在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难. 这时就需要一个可以查询,更新数据库操作的页面了: 本来用sql语句直接操作数据 ...
- ASP.net中网站访问量统计方法代码(在线人数,本月访问,本日访问,访问流量,累计访问)
一.建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_Src)和登录时间 (IP_DateTime),些表的信 ...
- 友盟(Swift)-集成、统计用户数量、具体页面访问数量、具体按钮点击数量
什么是友盟.有什么用? 这些傻瓜问题这里就不解释了,可以自己百度去. 友盟提供的文档和demo都是oc的,这里用swift写了一个小demo,在此分享一下. 步骤1:友盟后台注册应用(iOS),拿到a ...
- 使用MySQL统计页面访问及排名
统计访问页面数量,以分辨率进行排名 SELECT CONCAT(`height` , '*', `width`) AS `resolution` , COUNT(CONCAT(`height`, '* ...
- asp dotnet core 通过图片统计 csdn 用户访问
在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...
- Asp.net有关访问页面权限的限制和错误页面配置
一.访问页面权限的限制 一个小项目,涉及到用户登录. 在用户没登录访问内容也时,对页面做一定限制,没登录的则不能访问,直接跳转到登录界面. /// <summary> /// 对没有登录用 ...
- Asp.net 页面访问模板页的属性
首先 页面需要添加下面一段代码 <%@ MasterType VirtualPath="~/User/User.Master" %> 添加的位置如图 这样就可以在这个页 ...
- 在Asp.net MVC中访问静态页面
有时候由于一些特殊的需要,我们需要在MVC中访问HTML页面,假如您将这个页面放在Views中的话,去访问将会收到一个404,但是放在Views外面的目录则不受此限制. 那么我们就来解决View里面的 ...
随机推荐
- Spring导出可以运行的jar包
最近需要解决Maven项目导入可执行的jar包的问题,如果项目不包含Spring,那么使用mvn assembly:assembly即可,详情可以参考:http://www.cnblogs.com/l ...
- 苹果产品时间发布表统计(iPhone、iPad),以及32位和64位机的说明
之前因为某些原因,需要对apple家族的手机和pad产品做一个上市时间排序,以及分析分别是哪种CPU机型 总结如下: iPad家族: 1.iPad - 2010.1.27发布 2.iPad 2 ...
- iOS中自动登录的设计
1.//这是登录控制器页面 - (void)viewDidLoad { [super viewDidLoad]; //lt.iSNextAutoLogin是单利中的一个属性,用来保存下次是否自动登录 ...
- 初始cfx开发webservice, 简单实例应用
项目结构图: 步骤一: 添加maven 依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 将R非时间序列的data.frame转变为时序格式
将R非时间序列的data.frame转变为时序格式,常常会用到,尤其是股票数据处理中, 举例:dailyData包括两列数据:Date Close10/11/2013 871.9910/10/2013 ...
- mongodb浅析
设计特征: MongoDB 的设计目标是高性能.可扩展.易部署.易使用,存储数据非常方便.其主要功能特性如下. (1)面向集合存储,容易存储对象类型的数据.在MongoDB 中数据被分组存储在集合中, ...
- Android遍历API (1) 动画篇——克隆动画AnimationCloning
从我学Android开始,一直就想做一件事.就是好好把APIDemo看一遍.今天开始会抽时间把Android官方的APIDemo程序全部过一遍.主要是为了两个目的:第一,复习以前学习的API用法.第二 ...
- 去除partner页面消息 自动添加关注者的功能
某些公司希望在partner页面说些partner的坏话,可是odoo居然自动添加了partner关注,这就尴尬了.... 如果恰搭建了邮件服务器,很有可能就自动发到了客户邮箱里,等着炸锅吧.... ...
- ODbgScript 2.01帮助文档
-------------------------------ODbgScript original pluginhttp://github.com/odbgscript--------------- ...
- Ogre2.1 Hlms与渲染流程
在我前面三篇说明Ogre2.x的文章里,第一篇大致说了下Hlms,第二篇说了下和OpenGL结合比较紧的渲染,本文用来说下Hlms如何影响渲染流程中,因为有些概念已经在前面二文里说过了,本文就不再提, ...