Global.asax使用2
ASP.NET中利用Application和Session统计在线人数、历史访问量
先来简单说一下ASP.NET中的Application和Session
下图是我们非常熟悉的Web应用程序的结构:
在这张图中,Web服务器中运行的Web应用程序就是我们所说的Application,每个客户端与Web服务器之间建立的连接就可以看做是一个Session。比如现在服务器端运行的是一个论坛系统,那么现在这个正运行在服务器端的论坛系统的软件就可以看做Application,而每个在线的用户与之建立的连接就相当于一个Session。
那么很容易就会理解,Application是共享的,相当于“全局变量”,Session不是共享的,是属于每个客户端(浏览器)私有的。
所以上图用Application和Session可以表示为:
Application
常用属性:
| 属性 | 说明 |
| All | 返回全部的Application对象变量到一个对象数组 |
| AllKeys | 返回全部的Application对象变量到一个字符串数组 |
| Count | 返回Application中对象变量的数量 |
常用方法:
| 方法 | 说明 |
| Add | 新增一个Application变量值 |
| Clear | 清空全部Application变量值 |
| Get | 变量名传回的变量值 |
| Set | 更新Application变量值 |
| Lock | 锁定所有Application的变量值 |
| UnLock | 解除锁定Application的变量值 |
Session
常用属性:
| 属性 | 说明 |
| Count | 获取会话状态集合中Session对象的个数 |
| Contents | 获取对当前会话状态对象的引用 |
| Keys | 获取存储在会话中的所有值的集合 |
| SessionID | 获取用于标识会话的唯一会话ID |
| TimeOut | 获取或设置会话状态提供程序终止会话之前所允许的超时期限 |
| Mode | 获取当前会话状态模式 |
常用方法:
| 方法 | 说明 |
| Add | 新增一个Session对象 |
| Clear | 清除会话状态中的所有值 |
| CopyTo | 将会话状态值的集合富之岛一维数组中 |
| Remove | 删除会话状态集合中的项 |
| RemoveAll | 清除所有会话状态的值 |
ASP.NET中统计在线人数和历史访问人数,还需要四个事件:Application_Start()事件、Application_End()、Session_Start()事件和Session_End()事件。
当程序启动时,会首先在Global.asax.cs文件中触发Application的Application_Start()事件,我们需要在这个事件中增加两个Application变量值(因为这两个值是Application中的变量值,所以就相当于整个程序的“公共变量”):totalCount(用来表示总的访问量)、onlineCount(用来表示当前在线人数):
protected void Application_Start()
{
string strConn = "server=192.168.24.123;database=数据库名;uid=sa;pwd=123456;"; //数据库连接字符串
SqlConnection conn = new SqlConnection(strConn); //实例化数据库连接对象
conn.Open(); //打开数据库连接
string cmdText = "select count from Count"; //定义查询字符串
SqlCommand cmd = new SqlCommand(cmdText, conn); //实例化命令对象
int count = (int)cmd.ExecuteScalar(); //取出数据库中历史访问人数 Application["total"] = count; //定义Application变量值total并赋值为历史访问量
Application["onLine"] = ; //定义Application变量值onLine并赋值为0
}
下面就要编写Session_Start()事件代码,当每个客户端(浏览器)访问服务器时,就会触发Session_Start()事件,这事就要让“公共变量”totalCount和onlineCount都自增1,这时,当有多个客户端同时访问时,就有可能发生错误,所以要Application的Lock()方法先把Application中的变量锁起来(Application执行了Lock()方法之后,整站中所有关于Application的操作都会被锁定延时执行,包括Application赋值和Application读取),只让一个客户端进行这两个变量的自增,之后再进行解锁,供其他客户端进行操作:
protected void Session_Start()
{
Application.Lock(); //锁定Application
Application["total"] = (int)Application["total"] + ; //总访问量加1
Application["onLine"] = (int)Application["onLine"] + ; //在线人数加1
Application.UnLock(); //解除锁定
}
现在在线人数和历史访问数量都统计出来了,需要显示的时候直接调用Application["变量值"]就可以,比如要在名为Label的控件上显示在线人数,只需Label.Text=Application["onLine"].ToString()就OK了!需要注意的是,Application和Session中存储的变量值都是object类型的,给他们赋值的时候可以直接赋值,但是取出的时候就需要考虑类型了。
当一个客户端(浏览器)与服务器断开连接(即此客户端与服务器的会话关闭)时,会触发Session_End()事件,这时历史访问数量不改变,在线人数需要减1:
protected void Session_End()
{
Application.Lock(); //锁定Application
Application["onLine"] = (int)Application["onLine"] - ; //总访问数量不变,在线人数减1
Application.UnLock(); //解除锁定
}
为了方便测试,上面的例子可以通过在一台电脑上开启多个浏览器,也就相当于与服务器建立了多个Session,也许您测试的时候会发现一个问题,假如现在在线人数是10,您关闭了某个浏览器时,测试当前的在线人数即Application["onLine"]的值还是10 ,并没有执行“减1”操作。这是因为Session的TimeOut值默认是20分钟,也就是说,默认情况下,关闭了浏览器并不代表这个浏览器和服务器之间的连接已经断开,而要等待20分钟之后才会断开连接。(为了测试效果,您可以将TimeOut的值设置小一点)
最后,假如服务器要关闭,就要把目前Application中存储的历史访问总数重新更新到数据库中,需要在Application_End()事件中进行:
protected void Application_End()
{
string strConn = "server=192.168.24.123;database=数据库名;uid=sa;pwd=123456;"; //定义数据库连接字符串
SqlConnection conn = new SqlConnection(strConn); //实例化数据库连接对象
conn.Open(); //打开数据库连接
string cmdText = "update Count set count=@count"; //定义执行命令
SqlCommand cmd = new SqlCommand(cmdText, conn); //实例化命令对象
cmd.Parameters.Add(new SqlParameter("@count", Application["total"])); //为参数@count赋值为现在的总访问量
cmd.ExecuteNonQuery(); //执行命令
conn.Close(); //关闭数据库
}
通常在整个过程中,大多数人对Application_End()这个事件的疑问是最大的,因为如果您只是在VisualStudio上做的测试的话,关闭系统时,没有触发Application_End()事件,新的数据也就没有被写入到数据库中。那么Application_End()究竟在什么时候才会被触发呢 ?
想弄明白这个问题,需要将程序发布,这里以IIS为例,用IIS发布了程序之后运行,当想要触发Application_End()事件把最新的历史访问量写入到 数据库中时,需要在IIS中关闭此程序的运行,如下图:
注意:只是在服务器上停止该程序的运行才会触发Application_End()事件,重启和断电等情况并不能触发。
虽然统计在线人数和历史访问量是个并不起眼的小功能,但是通过捋一遍,细细地总结了一下,又学到了好多东西,脑子里的知识网又增大了一点点。。。。
Global.asax使用2的更多相关文章
- .net Global.asax文件使用
一.Application_start: 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义. Applicat ...
- asp.net(C#)网站发布后 Global.asax 里 Application_Error 不执行的问题
现象 在 Global.asax 用 Application_Error 捕捉了http的404,500等错误,在本机测试正常,发布后无效,几经周折终于解决了... 程序是这样设计的 Applicat ...
- Servlet实现asp.net中的Global.asax启动事件(Servlet和Listener使用)
1.Java Web中没有像asp.net的全局启动事件,但是可以通过web.xml中的load-on-startup节点来控制Servlet的开机启动和启动次数.web.xml详细配置参考:http ...
- Global.asax文件说明
Global.asax是我们的底层文件,第一次的IIS请求都会先去执行它里面的文件,所以学会它里面的函数是非常有必要的.而且我们总是忽略这里的知识点,总觉得这是不必须的,其实我们错了,这里才是程序的根 ...
- Global.asax 文件是什么
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看 ...
- EF架构~在global.asax里写了一个异常跳转,不错!
回到目录 一般地,网站出现异常后,我们会通过设置web.config的方法来实现友好页的显示,这个方法比较常用,但捕捉的信息不是很具体,在程序测试阶段,我们可以通过global.asax来实现友好的, ...
- ASP.NET MVC中的Global.asax文件
1.global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成 ...
- ASP.NET Global.asax详解
最近在研究bbsmax的代码,但是一直不知道入口在哪里,然后就对各个文件分析了,然后终于在对global.asax文件查看的时候看到Application_BeginRequest才明白入口,所以现在 ...
- Where is the Global.asax.cs file
I am using VS 2008. I have created a new Asp.net web site project from File->New->Website-> ...
- 转Global.asax文件
Global.asax 文件是什么 Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序 ...
随机推荐
- C#中DataTable转化JSON
[WebMethod(Description = "将一个DataTable对象转化成JSON")] public string GetJSON() { JavaScriptSer ...
- Android异步请求
class MyTask_SendMessage extends AsyncTask<String, Void, String> { @Override protected void on ...
- WebApi实现跨域功能
在配置文件的system.webServer节点中加入以下配置信息 <httpProtocol> <customHeaders> <add name="Acce ...
- NPOI导入导出Excel
.net mvc利用NPOI导入导出excel 注意:如何导出的提交方式ajax导出是失效的! 解决方案是:js处理l两个表单的提交 代码: 第一步. 在页面里面加入2个隐藏的iframe, 如下 ...
- poj3579 二分搜索+二分查找
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5468 Accepted: 1762 Descriptio ...
- zeromq源码分析笔记之无锁队列ypipe_t(3)
在上一篇中说到了mailbox_t的底层实际上使用了管道ypipe_t来存储命令.而ypipe_t实质上是一个无锁队列,其底层使用了yqueue_t队列,ypipe_t是对yueue_t的再包装,所以 ...
- Python爬虫——抓取贴吧帖子
抓取百度贴吧帖子 按照这个学习教程,一步一步写出来,中间遇到很多的问题,一一列举 首先, 获得 标题 和 贴子总数 # -*- coding:utf-8 -*- #!/user/bin/python ...
- python中的 json 模块使用
(1)python 中生成 json 字符串: import json data = dict(ret=0, msg="Welcome, Login success!") json ...
- 【笔记】shell下的主要工具
shell 下有很多工具是非常好的辅助. 一.自我精进的途径 1.help / --help :简要的帮助说明: help 是针对 shell 内建功能的帮助, gnu工具一般为 "程序名 ...
- a标签href不跳转 禁止跳转
a标签href不跳转 禁止跳转 当页面中a标签不需要任何跳转时,从原理上来讲,可分如下两种方法: 标签属性href,使其指向空或不返回任何内容.如: <a href="javascri ...