博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.Net 网站访问人数及在线人数
阅读量:5936 次
发布时间:2019-06-19

本文共 4011 字,大约阅读时间需要 13 分钟。

利用Application对象和Session对象可以统计历史访问人数和当前在线人数。

在会话开始和结束时,一定要进行加锁和解锁操作。由于多个用户可以共享Application对象,因此加锁是必要的,这样可以保证在同一时刻只有一个客户可以修改和存取Application对象的属性。如果加锁后,迟迟不给开锁,会导致用户无法访问Application对象。我们可以使用对象的Unlock方法来解除锁定。

在项目的web层的根目录下新建全局配置文件Global.asax以及日志文件VisitedLog.txt,这样做的好处是不用操作数据库,将计数写入日志文件,即使服务器重启计数也不会清零。首先,在Global.asax文件中添加以下代码:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Security; 6 using System.Web.SessionState; 7  8 namespace xxjy.Global 9 {10     public class Global : System.Web.HttpApplication11     {12         string sLogFile = AppDomain.CurrentDomain.BaseDirectory + "VisitedLog.txt";//日志文件的路径13         protected void Application_Start(object sender, EventArgs e)14         {15             // 在应用程序启动时运行的代码16             // Code that runs on application startup17             //刚启动,为了防止服务器意外死机重启等因素,需要从记录文件中读取数目18             if (!System.IO.File.Exists(sLogFile))19             {20                 System.IO.FileStream fsnew = System.IO.File.Create(sLogFile);21                 fsnew.Close();22             }23             string[] lines = System.IO.File.ReadAllLines(sLogFile);//读取并得到日志文件的行数24             double iTotalCount = 0;//设置初始访问人数为025             int iOnline = 0;//设置初始在线人数为026             if (lines != null && lines.Length > 0)27             {28                 Double.TryParse(lines[lines.Length - 1].ToString(), out iTotalCount);29             }30             Application["TotalCount"] = iTotalCount;31             Application["Online"] = iOnline;32         }33 34         protected void Session_Start(object sender, EventArgs e)35         {36             // 在新会话启动时运行的代码37             // Code that runs when a new session is started38             Session.Timeout = 10;39             Application.Lock();//锁定变量40             Application["TotalCount"] = System.Convert.ToDouble(Application["TotalCount"]) + 1;//为页面访问量+141             Application["Online"] = System.Convert.ToInt32(Application["Online"]) + 1;//为页面在线人数+142             Application.UnLock();//解锁43             if (Convert.ToInt32(Application["TotalCount"]) % 50 == 0) //为了防止服务器死机重启等意外因素丢失数据,我们每隔50个访客更新一下记录文件,这个需要根据访问量调整44             {45                 System.IO.StreamWriter rw = System.IO.File.CreateText(sLogFile);46                 rw.WriteLine(Application["TotalCount"]);47                 rw.Flush();48                 rw.Close();49             }50         }51 52         protected void Application_BeginRequest(object sender, EventArgs e)53         {54 55         }56 57         protected void Application_AuthenticateRequest(object sender, EventArgs e)58         {59 60         }61 62         protected void Application_Error(object sender, EventArgs e)63         {64             // 在出现未处理的错误时运行的代码65         }66 67         protected void Session_End(object sender, EventArgs e)68         {69             // 在会话结束时运行的代码。 70             // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为71             // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 72             // 或 SQLServer,则不会引发该事件。73             Application.Lock();74             Application["Online"] = System.Convert.ToInt32(Application["Online"]) - 1;//在线人数减175             Application.UnLock();76 77         }78 79         protected void Application_End(object sender, EventArgs e)80         {81             //在应用程序关闭时运行的代码82             //保存当前访问83             System.IO.StreamWriter rw = System.IO.File.CreateText(sLogFile);84             rw.WriteLine(Application["TotalCount"]);85             rw.Flush();86             rw.Close();87         }88     }89 }

然后在xxx.aspx页面添加能显示文本的控件,如label,或直接在cs文件中用Rsponse.write()输出。

接着在cs中添加如下代码:

1  protected void Page_Load(object sender, EventArgs e) 2         { 3             if (!IsPostBack) 4             { 5                 if (Application["TotalCount"] != null) 6                 { 7                     Label1.Text = Application["TotalCount"].ToString(); 8                 } 9             }10         }

 

转载于:https://www.cnblogs.com/muran/p/3240303.html

你可能感兴趣的文章
兼容所有浏览器的复制到剪切板功能,悬浮层不能复制问题解决
查看>>
day 20 第一阶段考试总结
查看>>
我的友情链接
查看>>
Centos 7.5 部署DNS
查看>>
yum简介
查看>>
cp讲解
查看>>
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
查看>>
如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
查看>>
论代码审查的重要性
查看>>
「docker实战篇」python的docker爬虫技术-导学(一)
查看>>
linux日志基础介绍
查看>>
如何关闭SElinux
查看>>
处理器之MMU(三)
查看>>
172.16.82.0/25的含义,IP段,掩码
查看>>
测试之路
查看>>
终于对了
查看>>
RabbitMQ集群
查看>>
Apache防盗链和隐藏版本信息
查看>>
ARP协议与路由
查看>>
使用pypiserver搭建私有源
查看>>