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里面的 ...
随机推荐
- MySQL 数据的 截取,数据清洗
Mysql字符串截取函数SUBSTRING的用法说明 函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(conte ...
- SNF开发平台WinForm-Grid表格控件大全
我们在开发系统时,会有很多种控件进行展示,甚至有一些为了方便的一些特殊需求. 那么下面就介绍一些我们在表格控件里常用的方便的控件: 1.Grid表格查询条 Grid表格下拉 3.Grid表格弹框选 ...
- 转移 Visual Studio 2017 的安装临时文件
每次更新 Visual Studio 2017 会在 C 盘留下大量的缓存文件,因为目录比较深,怕以后忘了,用目录链接的形式转移到其它磁盘,也好方便清理: mklink /D C:\ProgramDa ...
- 【Python】 sort、sorted高级排序技巧
文章转载自:脚本之家 这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Pyth ...
- 《转》vue更新到2.0之后vue-resource不在更新,axios的使用
vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...
- (转)Linux服务器磁盘空间占满问题
转自:https://www.cnblogs.com/cindy-cindy/p/6796684.html 下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望碰 ...
- pandas删除缺失数据(pd.dropna()方法)
1.创建带有缺失值的数据库: import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), ind ...
- django 拷贝一个 model 实例
今天做一个拷贝功能,把某个 obj 拷贝并修改部分数据,提交表单后保存为一个新实例.结果google 出来的结果不对,都是相互copy 的代码,大概如下: obj = MyModel.objects. ...
- Jenkins这种构建工具,一般都是内部使用,所以外部基本上不能访问
类似于Jenkins这种构建工具,一般都是内部使用,所以外部基本上不能访问,也可以隔绝外部黑客的入侵等.直接暴露外部是非常不安全的,特别是没有什么安全验证,容易被别人入侵做一些非法的事情! 所以,希望 ...
- .net core实现跨域
什么是跨域在前面已经讲解过了,这里便不再讲解,直接上代码. 一.后台API接口 用.net core创建一个Web API项目负责给前端界面提供数据. 二.前端界面 建立两个MVC项目,模拟不同的ip ...