.Net如何统计在线人数

统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观的了解到网站的吸引力或者网站程序的效率现在,我们就介绍一个简单明了的方法来统计在线用户的多少,该方法的特点就是充分的利用了ASP.NET的特点,结合global.asax文件,用Application和Session巧妙的实现在线用户的统计,由于程序中只用到一个Application,所以,程序占用系统资源几乎可以忽略不及,当然,这也是网站管理者最关心的问题之一

一用户显示页面的使用 

首先,我们来看看怎样现实当前网站的访问用户数量,程序代码如下: 


<%@ Page Language= "c# " debug= "true " %> 
<html> 
<head> 
<SCRIPT LANGUAGE= "c# " RUNAT= "server "> 
private void Page_Load(object sender, System.EventArgs e) 

Visitors.Text = "本站当前有: <b> " + Application[ "user_sessions "].ToString() + " " + "</b> 位访问者 ! "; 

<title>在线用户</title> 
</head> 
<body> 
<asp:label " runat= "server " /><br> 
</body> 
</html> 

可以看出,以上的程序特别简单,就是调用Application当然,我们不必要专门设计一个页面来显示在线用户数量,在网站的任何页面,我们都可以直接调用Application( "user_sessions ").ToString()来显示当前用户数量 

二global.asax文件实现 

global.asax文件的作用我们自不必说,现在,我们直接来看统计当前在线用户数量如何实现: 


<script language= "c# " runat= "Server "> 
protected void Application_Start(Object sender, EventArgs e) 

Application[ "user_sessions "] = 0; 

protected void Session_Start(Object sender, EventArgs e) 

Application.Lock(); 
Application[ "user_sessions "] = (int)Application[ "user_sessions "] + 1; 
Application.Unlock(); 

protected void Session_End(Object sender, EventArgs e) 

Application.Lock(); 
Application[ "user_sessions "] = (int)Application[ "user_sessions "] - 1; 
Application.Unlock(); 

</script> 

以上代码很容易理解,当网站开始服务的时候(Application开始的时候),程序设置Application[ "user_sessions "]为零,然后,当用户进入网站(Session开始的时候)的时候,锁定Application,然后,将application( "user_sessions ")加一,用户退出网站的时候,application( "user_sessions ")减一这样,就很巧妙的实现了在线用户的统计 

三一点讨论 

以上的统计,简明扼要,程序很容易实现但是,如果我们仔细考虑,发现该方法有一定的局限,统计出来的在线用户数量可能稍微有点误差因为我们在以上程序中,是根据用户建立和退出会话(Session)来实现在线人数的加减的,而我们知道,如果用户没有关闭浏览器,而进入另外一个网站,那么,这个会话在一定的时间内是不会结束的,这个时间我们可以通过TimeOut来设置,一般的,我们设置为20分钟所以,在用户数量统计上面,还是存在一点误差的 

另外,我们知道,在ASP中,如果用户将浏览器上面的Cookies设置为禁用,那么,Session就不能再被传递,显然,这样设置让以上的统计程序无能为力不过,在ASP.NET中我们有解决方法,在config.web文件中,我们将<sessionstate cookieless= "false " />设置为true就可以了,也就说,不使用Cookies也可以传递Session这样,我们的程序就可以在不同的访问者环境中顺利运行 

准备工作
1、新建一个TongJi 的数据库,添加一个 tongji 的表,在表中有一个 Number 的字段,为 int 类型,Numger初值为1000;
2、新建一个网站;
3、新建数据库连接字符串(具体方法)并将其保存到Web.config 文件中, <connectionString>节的代码如下: 

<connectionStrings>
            <add name="TongJiConnectionString" connectionString="Data Source=.;Initial Catalog=TongJi;Integrated Security=True" providerName="System.Data.SqlClient"/>
        </connectionStrings>

关键代码 
4、添加新项/全局应用程序类:Global.asax ,其文件的全部代码如下:




<%@ Application Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<script runat="server">

        void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码         
            SqlConnection con = new SqlConnection();
            con.ConnectionString = ConfigurationManager.ConnectionStrings["TongJiConnectionString"].ConnectionString;
            con.Open();
            SqlCommand cmd = new SqlCommand("select * from tongji", con);
            int count = Convert.ToInt32(cmd.ExecuteScalar());
            con.Close();
            Application["total"] = count;
            Application["online"] = 0;
        }
    
        void Application_End(object sender, EventArgs e) 
        {
            //      在应用程序关闭时运行的代码
            SqlConnection con = new SqlConnection();
            con.ConnectionString=ConfigurationManager.ConnectionStrings["TongJiConnectionString"].ConnectionString;
            con.Open();
            SqlCommand cmd = new SqlCommand("update tongji set Number=" + Application["total"].ToString(), con);
            cmd.ExecuteNonQuery();
            con.Close();
        }
        
        void Application_Error(object sender, EventArgs e) 
        { 
            // 在出现未处理的错误时运行的代码
        }

        void Session_Start(object sender, EventArgs e) 
        {
            // 在新会话启动时运行的代码
            Application.Lock();
            Application["total"] = (int)Application["total"] + 1;
            Application["online"] = (int)Application["online"] + 1;
            Application.UnLock();
        }

        void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            Application.Lock();
            Application["online"] = (int)Application["online"] - 1;
            Application.UnLock();
        }
       
</script>


运行测试
5、拖两个Lable 到 Default.ASPx      上;
6、其Default.ASPx.cs 代码如下:

public partial class _Default : System.Web.UI.Page 
{
        protected void Page_Load(object sender, EventArgs e)
        {
            this.Label1.Text = "总访问人数" + Application["total"].ToString();
            this.Label2.Text = "当前在线数" + Application["online"].ToString();
        }
}


7、OK!!启动调试。

注意事项

8、
          我在VS2005中调试进行时,显示:总访问人数为1001;当前在线数1当;
          我重新打开另外一个IE,并把地址Copy过去,这时显示:总访问人数为1002;当前在线数2;
          这说明一切正常。但数据库中仍然为1000,??????
          我就是在这里让耽误了很多的时间(一天),但在我绝望时,我多试了一次,
          然而,这一次上天意给了我意外的恩赐。

          这时,我在VS2005中,"文件"菜单,选择“保存Global”;
          此时,数据库中的1000才更新为1002。
          如果在I I S 中调试也一样,要正常关机或停掉WWW服务才将数据一性写进数据库。

转载于:https://www.cnblogs.com/wdpp/archive/2010/03/30/2386977.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EFI BIOS下的磁盘管理工具Diskpart,Efifmt与Efichk(转)

Diskpart.efi GPT分区格式工具下载&#xff1a; EfiDiskUtility v1.3(X64).rarhttp://pan.baidu.com/share/link?shareid174670&uk3204866771 EFI BIOS作为一种创新的BIOS架构,自然有其独特之初,今天我给大家一下运行在EFI Shell环境下几款由Microsoft开发的磁盘管理工具.…

php负责传递数据,php传递数据的方法有哪些

php传递数据的方法有哪些发布时间&#xff1a;2021-03-19 09:10:54来源&#xff1a;亿速云阅读&#xff1a;58作者&#xff1a;小新这篇文章将为大家详细讲解有关php传递数据的方法有哪些&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家做个参考&#xff0c;希望大家阅…

ubuntu远程桌面连接命令rdesktop连接windows远程桌面详解

sudo apt-get install rdesktoprdesktop 124.42.120.174:1433 呵呵&#xff0c;连接成功了。 -f 全屏-a 16位色默认端口是3389&#xff08;linux 22 sh&#xff09;注意&#xff1a;windows 的服务中的 Terminal Servies 需要开启。我的电脑 右键 属性 远程中&#xff0c;勾选 …

那一瞬...

那一日&#xff0c;那一月&#xff0c;那一年&#xff0c;那一世... 仓央嘉措 那一日 我闭目在经殿的香雾中 蓦然听见你诵经的真言 那一月 我摇动所有的经筒&#xff0c;不为超度 只为触摸你的指尖 那一年 磕长头匍匐在山路&#xff0c;不为觐见 只为贴着你的温暖 那…

除了工作怎么交朋友_夫妻感情不好怎么办?夫妻关系紧张该如何解决?

夫妻感情不好怎么办?夫妻关系紧张该如何解决&#xff1f;1. 象征两人的兴趣随着年龄的增长而多样化。年轻的时候往往因为他们之间的差异而互相吸引&#xff0c;但当他们在中老年则需要更多的安慰或关心&#xff0c;理解&#xff0c;需求就不同了。当你发现自己的志向迥然不同时…

php学习_与mysql的连接 2013.01.04

我之前学习了一点mysql&#xff0c;所以跳过了两讲关于mysql的部分。 不知道为什么&#xff0c;我没有打开wamp时&#xff0c;在ie浏览器中输入http://localhost&#xff0c;就无法显示。后来打开了之后&#xff0c;才能在浏览器显示.php文件内容。.php文件是服务器端的&#x…

受管制的代码

其实整个.NET项目都是运行在.NET Framework上的托管代码&#xff0c;这个道理和JAVA虚拟机的机制是类似的。 最简单的说呢&#xff0c;受托管的代码不能直接写内存&#xff0c;是安全的&#xff0c;而非托管代码是非安全代码&#xff0c;可以使用指针操作内存。 一般的项目使…

javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景

在今天之前我一直以为setTimeout这个函数是异步的&#xff0c;无意中看到了一篇关于setTimeout的文章。发现自己曾经的认识全是错误的&#xff0c;赶紧总结下。 先看一段代码&#xff1a; var start new Date(); setTimeout(function(){var end new Date();console.log("…

java websocket修改为同步_服务端向客户端推送消息技术之websocket的介绍

websocket的介绍在讲解WebSocket前&#xff0c;我们先来看看下面这种场景&#xff0c;在HTTP协议下&#xff0c;怎么实现。需求&#xff1a;在网站中&#xff0c;要实现简单的聊天&#xff0c;这种情况怎么实现呢&#xff1f;如下图&#xff1a;​当发送私信的时候&#xff0c;…

Extjs checkbox 多删除

var BankOrderstore new Ext.data.JsonStore //数据源({url: "../Handler/TxnRefund.ashx",totalProperty: ToTalRecord,root: "ResultData",listeners:{beforeload: function () {this.baseParams {"method": "QU…

汇编学习笔记(二)--数据处理的两个基本问题

1.div 除数 有8位和16位两种&#xff0c;在一个reg或者内存单元中 被除数 默认放在ax或者ax和dx中&#xff0c;如果除数位8位&#xff0c;被除数为16位&#xff0c;默认放在ax中&#xff1b; 如果除数为16位&#xff0c;被除数为32位&#xff0c;在dx和ax中存放&#xff0c;dx存…

oracle对sga统计信息不对,oracle 索引失效原因及解决方法

一、以下的方法会引起索引失效‍1,<>2,单独的>,3,like "%_" 百分号在前.4,表没分析.5,单独引用复合索引里非第一位置的索引列.6,字符型字段为数字时在where条件里不添加引号.7,对索引列进行运算.需要建立函数索引.8,not in ,not exist.9,当变量采用的是time…

python random randint_python中random.randint和random.randrange的区别详解

在python中&#xff0c;通过导入random库&#xff0c;就能使用randint 和 randrange 这两个方法来产生随机整数。那这两个方法的区别在于什么地方呢&#xff1f;让我们一起来看看&#xff01; 区别: randint 产生的随机数区间是包含左右极限的&#xff0c;也就是说左右都是闭区…

How to change max_allowed_packet size

2019独角兽企业重金招聘Python工程师标准>>> How to change max_allowed_packet size up vote 116 down vote favorite 40I am having a problem with BLOB fields in my MySQL database - when uploading files larger than approx 1M…

cmake,make,nmake的用法

于是开始找跨平台的编译工具&#xff0c;其中最有名的两个是 cmake 和 scons&#xff0c;cmake 之所以出名估计是因为 KDE 4 从 autotools 转向用 cmake 来编译。而 scons 则是 lighttpd 原来用的编译工具&#xff0c;它现在也转向 Python 了。cmake 和 python 大概代表了新一代…

CSS中em和px单位的区别(转)

这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章&#xff0c;题目有点吓人&#xff0c;但是确实是现在国内网页制作方面的一些缺陷。我一直也搞不清楚px与em之间的关系和特点&#xff0c;看过以后确实收获很大。平时都是用px来定义字体&#xff0c;所以无法用浏览器字体…

oracle的age datetime,python cx_Oracle插入TIMESTAMP字段后显示格式问题?

目标&#xff1a;A张表内有个 TIMESTAMP 字段&#xff0c;需要读取后插入到B表中&#xff1b;问题&#xff1a;使用 cx_Oracle模块读取该字段时显示为 datetime.datetime(2016, 9, 1, 0, 0, 1, 288000) 样式&#xff1b;使用 executemany 方法插入B表后&#xff0c;再次读取B表…

.net runtime占用cpu_.net 中的StringBuilder和TextWriter区别

最近闲来之余&#xff0c;看了一些开源的类库&#xff0c;看到有些类库喜欢用TextWriter类来记录相关的字符串数据&#xff0c;感到比较好奇&#xff0c;为啥不用StringBuilder类对象。于是在网上搜索了一番&#xff0c;总结了相关笔记。StringBuilder类在 .net 中,字符串作为一…

微信页面弹出窗口,底部不随窗口滑动而滚动

公司是做微信第三方公众平台&#xff0c;有一个购物系统&#xff0c;现在需要将商品页面模仿淘宝的样式&#xff0c;就是点击购物车或购买按钮&#xff0c;会弹出一个窗口&#xff0c;显示sku和数量。本来就是一个做java后台的&#xff0c;前端布局不是很懂&#xff0c;上网搜索…

基本java,jquery异步 的级联下拉列表

第一次写博客&#xff0c;为了就是记录自己的学习历程&#xff0c;做一个整理 业务需求&#xff1a;有两个下拉列表&#xff0c;部门列表和职位列表&#xff0c;实现级联 1:本功能是在strut2框架下完成的&#xff0c;在进入页面时通过action初始化部门下拉列表 前台代码如下&am…