6.8 Application对象
Application对象派生自HttpApplicationState类,它可以生成一个全部的Web应用程序都能存取的状态变量,此变量是建立在服务器内存中的,可以涵盖所有的使用者,用来记录整个网站的信息。
6.8.1 Application对象的属性和方法
HttpApplicationState类是由用户在global.asax文件中定义的应用程序的基类。此类的实例Application对象是在ASP.NET基础结构中创建的,而不是由用户直接创建的。一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。这样,成员变量才可用于存储针对每个请求的数据。
Application的原理是在服务器端建立一个状态变量,来存储所需的信息。要注意的是,首先,这个状态变量是建立在内存中的,其次是这个状态变量是可以被网站的所有页面访问的。
Application对象有如下特点:
● 数据可以在Application对象内部共享。
● 一个Application对象包含事件,可以触发某些Applicatin对象脚本。
● 个别Application对象可以用Internet Service Manager来设置而获得不同属性。
● 单独的Application对象可以隔离出来在它们自己的内存中运行。
● 可以停止一个Application对象(将其所有组件从内存中驱除)而不会影响到其他应用程序。
● 一个网站可以有不止一个Application对象。典型情况下,可以针对个别任务的一些文件创建个别的Application对象。例如,可以建立一个Application对象来适用于全部公用用户,而再创建另外一个只适用于网络管理员的Application对象。
● Application对象成员在服务器运行期间持久地保存数据。Application对象成员的生命周期止于关闭IIS或使用Clear方法清除。
● 因为多个用户可以共享一个Application对象,所以必须要有Lock和Unlock方法,以确保多个用户无法同时改变某一属性的现象。
Application的原理是在服务器端建立一个状态变量,来存储所需的信息。要注意的是,首先,这个状态变量是建立在内存中的,其次是这个状态变量是可以被网站的所有页面访问的。
Application对象用来存储变量或对象,以便在网页再次被访问时(不管是不是同一个连接者或访问者),所存储的变量或对象的内容还可以被重新调出来使用,也就是说Application对于同一网站来说是公用的,可以在各个用户间共享。访问Application对象变量的方法如下所示:
以上代码,第1行给Application对象设置一个名称并赋值。第2行获取该Application对象的值并赋给某个变量。
为了简便,还可以把Application["变量名"]直接当作变量来使用。在Web页面中可以通过语句<%=Application["变量名"]%>直接使用这个值。如果通过ASP.NET内置的服务器对象使用应用程序变量,则代码为:Label1.Text = (String)Application["变量名"]。
利用Application对象存取变量时需要注意以下几点:
● Application对象变量应该是经常使用的数据,如果只是偶尔使用,可以把信息存储在磁盘的文件中或者数据库中。
● Application对象是一个集合对象,它除了包含文本信息外,也可以存储对象。
● 如果站点开始就有很大的通信量,则建议使用Web.config文件进行处理,不要用Application对象变量。
Application对象的常用属性和方法如表6-8所示。
表6-8 Application对象的常用属性和方法
(续表)
Application对象是一个集合对象,并在整个ASP.NET网站内可用,不同的用户在不同的时间都有可能访问Application对象的变量,因此Application对象提供了Lock方法用于锁定对HttpApplicationState变量的访问,以避免访问同步造成的问题。在对Application对象的变量访问完成后,需要调用Application的UnLock方法取消对HttpApplicationState变量的锁定。下面的代码通过Lock和UnLock方法实现了对Application变量的修改操作。
上面的代码中第1行在更改变量前执行Lock()方法避免其他用户存取Online和AllAccount变量,如果是读取变量而不是更改变量,就不需要Lock()方法。如第4行所示,在更改完成后,要及时调用UnLock()函数,以便让其他用户可以更改这些变量。
Application对象还有两个比较重要的事件Application_OnStart和Application_OnEnd,其中Application_OnStart在ASP.NET应用程序被执行时被触发,Application_OnEnd事件在ASP.NET应用程序结束执行时被触发。一般在Global.asax文件对这两个事件进行处理,添加用户自定义代码。
6.8.2 Application对象的使用
前面介绍了Application对象的概念以及它的常用方法和属性。本节通过一个实例来演示Application对象属性和方法在实际中的使用。
【实例6-8】Application对象的使用
大多数网站都有统计网站访问量的功能,通过统计网站的访问量,可以清楚地反映网站的人气,本题要求利用Application对象来实现统计网站的总访问量,运行效果如图6-18所示。
图6-18 “添加新项”对话框
01 启动Visual Studio 2012,创建一个ASP.NET Web空应用程序,命名为“实例6-8”。
02 在“实例6-8”中创建一个名为Default.aspx的窗体。
03 单击网站目录下的Default.aspx文件,进入“视图编辑”界面,打开“源视图”,在编辑区中<form></form>标记之间编写如下代码。
上面的代码中添加一个标签服务器控件Lable,用于显示访客的数量。
04 以右键单击“实例6-8”名称,在弹出快捷菜单中选择“添加”︱“添加新项”命令,弹出的如图6-18所示的“添加新项”对话框。
05 在“添加新项”对话框中选择“已安装”模板下的“Visual C#”模板,并在模板文件列表中选中“全局应用程序类”,然后在“名称”文本框输入该文件的名称Global.asax,最后单击“添加”按钮。此时解决方案资源管理的“实例6-8”的根目录下面会生成一个如图6-19所示的Global.asax页面,它包括了一个Default.aspx.cs文件用于编写后台代码。
图6-19 生成Global.asax文件
06 单击网站目录下的Global.asax文件,添加对Application对象的Application_Start事件和Session对象的Session_Start事件的处理代码:
上面的代码中,第2行初始化Application变量的值为0。第5行执行Lock操作,防止别人修改Visitors的值,第6行把Visitors的值加1,第7行执行UnLock操作,放开对Visitors变量值的控制。
07 单击网站目录下的Default.aspx.cs文件,编写代码如下:
上面的代码中处理定义Page页面加载事件Load的方法,第2行得到Visitors变量的值,因为该变量的类型是Object,因此需要调用Convert对象的ToInt32方法把它转换为整数。
08 按快捷键Ctrl+F5运行程序,如图6-20所示。每次页面被访问时,网站的访问量就会增加。
图6-20 运行效果