5.1 Application对象
Application对象是内置的ASP.NET对象,表示ASP.NET应用程序的示例。Application对象用来存储变量或对象,以便在网页再次被访问时,所存储的变量或对象的内容还可以被重新调出来使用。也就是说,Application对象对于同一网站来说是公用的,可以在各个用户间共享。
5.1.1 Application对象的属性
Application对象是HttpApplicationState类的实例,它包含所有与应用程序相关的方法和集合。HttpApplicationState类的单个实例,将在客户端第一次从某个特定的ASP.NET应用程序虚拟目录中请求任何URL资源时创建。对于Web服务器上的每个ASP.NET应用程序,都要创建一个单独的实例,然后通过内部Application对象公开对每个实例的引用。
Application对象提供了多个属性,通过这些属性可以获取集合中的对象数或者访问集合中的对象,常用属性如表5-1所示。
表5-1 Application对象的常用属性
可以通过键名和索引两种方式向Application对象中添加数据。
Application["keyName"] = objectValue; //通过键名 Application[0] = objectValue; //通过索引
【范例1】
通过键名的形式向Application对象中分别添加totalCount对象和comprehensiveScore对象,最后调用Application对象的Count属性输出对象数,代码如下。
Application["totalCount"] = 12; Application["comprehensiveScore"] = 98.5; Response.Write("Application中保存的对象数:" + Application.Count);
5.1.2 Application对象的方法
Application对象提供了一系列的方法,通过调用方法也可以实现更改数据的添加、删除和更改。如表5-2所示列出了Application对象的常用方法,并对这些方法进行说明。
表5-2 Application对象的常用方法
1.Add()方法
Application对象的Add()方法是指将新的对象添加到System.Web.HttpApplicationState集合,语法如下。
void HttpApplicationState.Add(string name, object value)
其中,name是指要添加到集合中的对象名,也称为键名;value是指对象的值。
【范例2】
在Web窗体页的后台Load事件中添加代码,调用Add()方法添加First、Second和Third对象,然后通过Application["Fourth"]添加第4个对象,最后通过for语句遍历集合中的每个对象。代码如下。
protected void Page_Load(object sender, EventArgs e) { Application.Add("First", "程瑶"); Application.Add("Second", "Lucy"); Application.Add("Thrid", "飞飞"); Application["Fourth"] = "木木"; for (int i = 0; i < Application.Count; i++) { //遍历Application 集合中的对象 lblMessage.Text += "变量名:" + Application.GetKey(i) + ",变量值: " + Application[i]+"<br/>"; } }
其中,lblMessage是Label控件的ID属性值。
运行窗体页面查看效果,如图5-1所示。之所以会输出7个对象,是因为Application是一个全局对象,而totalCount和comprehensiveScore在范例1中已创建,因此这里会将它们显示出来。
图5-1 Application添加对象1
虽然Application["keyName"]和Application.Add()都可以添加对象,但是它们有很大的区别。当为同一个对象指定属性值时,Application["keyName"]会用新值代替旧值,而Add()方法依然会添加新的内容。重新运行上面的BaseTest.aspx页面,如图5-2所示。
图5-2 Application添加对象2
2.Clear()方法
Clear()方法用于从HttpApplicationState集合中清除所有对象。例如,在范例2添加对象之前,可以调用Clear()方法,代码如下。
Application.Clear();
重新运行或刷新页面,效果如图5-3所示。
图5-3 Clear()方法的使用
3.Remove()方法
Remove()方法指定从HttpApplicationState集合中移除命名对象,使用时需要传入一个string类型的参数,代码如下。
void HttpApplicationState.Remove(string name)
【范例3】
在前面范例的基础上添加代码,通过Remove()方法删除键名为Second的对象,然后再通过for循环遍历Application对象,代码如下。
Application.Remove("Second"); for (int i = 0; i < Application.Count; i++) { //遍历Application集合中的对象 lblMessage.Text += "变量名:" + Application.GetKey(i) + ",变量值:" + Application[i] + "<br/>"; }
运行页面查看效果,如图5-4所示。
图5-4 Remove()方法的使用
除了Remove()方法外,RemoveAll()和RemoveAt()方法也可以移除指定的对象。RemoveAll()方法移除所有的对象,其效果与Clear()方法一致。RemoveAt()是按照索引移除指定对象,语法如下。
void HttpApplicationState.RemoveAt(int index)
4.Set()方法
Set()方法表示更新HttpApplicationState集合中的对象值。基本语法如下。
void HttpApplicationState.Set(string name, object value)
其中,name指定要更新的对象名;value指定对象更新之后的值。如果name在Application中不存在,则会向HttpApplicationState中添加一个新对象,对象名为name,对象值为value。
【范例4】
如下代码将Application中键名为Third的对象的值更改为“abc”。
Application.Set("Thrid", "abc");
5.GetKey()方法
GetKey()方法表示通过索引获取HttpApplicationState对象名。语法如下。
void HttpApplicationState.GetKey(int index)
在范例2通过for语句遍历Application中的对象时,已经使用到了GetKey()方法。除了这个方法外,也可以通过以下语法获取指定对象的值。
Object value = Application["keyName"]; //根据键名获取 Object value = Application[0]; //根据索引获取
6.Lock()方法和UnLock()方法
Application对象使给定应用程序的所有用户之间共享信息,并且在服务器运行期间持久地保存数据。由于多个用户可以共享一个Application对象,因此,必须要有Lock()和UnLock()方法,以确保多个用户无法同时改变某一属性。Application对象成员的生命周期止于关闭IIS或使用Clear()方法清除。Lock()和UnLock()方法的使用语法如下。
Application.Lock(); Application["变量"] = "内容"; Application.UnLock();
5.1.3 使用Application的事件
在ASP.NET应用程序中可以包含一个特殊的文件——Global.aspx文件,也称作ASP.NET应用程序文件,它包含用于响应ASP.NET或HTTP模块引发的应用程序级别事件的代码。Global.asax文件提供了7个事件,其中5个应用于Application对象。如表5-3所示对这些事件进行了说明。
表5-3 Application对象的常用事件
在VS 2012中创建基于窗体的应用程序时会自动创建一个Global.asax文件。如果没有创建,开发者可以像创建Web窗体页那样创建Global.asax文件。
统计在线用户的作用是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观地了解到网站的吸引力或者网站程序的效率。下面的范例将Application和Global.asax文件结合起来,实现在线用户的统计。
【范例5】
将Application和Global.asax结合统计在线用户的访问量,步骤如下。(1)打开当前应用程序中的Global.asax文件,如果不存在,需要进行创建。
(2)在Application_Start事件中添加代码,初始化统计在线人数的全局变量。如果在线人数为空,则将其初始化为0,代码如下。
protected void Application_Start(object sender, EventArgs e) { if (Application["CountOnline"] == null) { Application["CountOnline"] = 0; } }
(3)在Session_Start事件中添加代码,对统计在线人数的全局变量加1。更改全局变量值之前需要调用Application对象的Lock()方法锁定,更改之后调用Application对象的UnLock()方法解锁。另外,为了方便测试,在更改全局变量之前将Session对象的Timeout属性值设置为1,即Session的生存时间为1 min,代码如下。
void Session_Start(object sender, EventArgs e) { Session.Timeout = 1; Application.Lock(); Application["CountOnline"] = (int)Application["CountOnline"] + 1; Application.UnLock(); }
(4)在会话对象销毁时要对统计在线人数的全局变量减1。向Session_End事件中添加如下代码。
void Session_End(object sender, EventArgs e) { Application.Lock(); Application["CountOnline"] = (int)Application["CountOnline"] -1; Application.UnLock(); }
(5)创建GetVisitPerson.aspx页面,并在该页面中添加如下代码。
<div>当前在线访问人数:<%=Application["CountOnline"] %></div>
(6)在多个浏览器中运行GetVisitPerson.aspx页面并查看效果,效果图不再显示。