11.3 Application对象的状态管理
在 ASP.NET 程序中可以使用 Application 和 Session 对象建立变量,可以称其为 Application 和 Session 变量,它们可以用来存储用户状态信息的共享数据。
11.3.1 Application对象基础
Application 和 Session 对象的目的是为了保留用户状态,以便 ASP.NET 程序能够顺利执行,其差异只是保留变量的范围不同。
1. 什么是Application对象
Application 对象可以建立 Application 变量,它和一般程序变量不同,Application 变量是一个 Contents 集合对象,此变量可以为访问网站的每位用户提供一个共享数据的通道,因为 Application 变量允许网站的每位用户获取或更改其值。
Application 对象是在第 1 个 Session 对象建立后建立,Application 对象的范围直到 Web 服务器关机或所有的用户都离线后才会删除。
2. Application变量的使用
不论网站中有多少位用户同时浏览网站(不是指登录网站的用户),在服务器端内存只保留一份 Application 变量,其变量格式如下。
Application("HitCounter")= 1234
上述程序代码将名为Hit_Counter的Application 变量设为 1234,此变量和 ASP.NET 程序变量不一样,它是获取 Contents 集合对象的元素,变量名称是字符串。Application 对象是 System.Web 名称空间的 HttpApplicationState 类,其常用属性如表11-4所示。
表11-4 Application对象的常用属性
|
属 性 |
说 明 |
|
Contents |
获取 HttpApplicationState 对象,此属性是为了和旧版 ASP 兼容 |
|
Count |
获取共有多少个 Application 变量,也就是 HttpApplicationState 集合对象的对象数 |
|
Item |
使用变量名称或索引值获取 Application 变量值 |
3. Application状态管理的同步
ASP.NET 应用程序的每位用户都可以存取 Application 变量,用户可以同时读取 Application 变量,但是如果有一位更改数据,其他用户读取数据时,就会发生数据冲突情况,为了避免这情况发生,需要考虑同步问题。
在 Application对象中提供Lock()和Unlock()方法,可以保障在同一时间内只允许一位用户存取 Application 变量,其程序代码如下所示。
Application.Lock()
Application("HitCounter")=Application("HitCounter")+1
Application.Unlock()
上述程序代码在更改变量前执行 Lock()方法避免其他用户存取此变量,如果读取就不需要 Lock()方法。在更改后,此例是将 Application 变量 Hit_Counter 值加 1 后,即可使用 Unlock()方法,以便让其他用户更改此变量。Application 对象的常用方法如表11-5所示。
表11-5 Application对象的常用方法
|
方 法 |
说 明 |
|
Lock() |
禁止其他用户修改 Application 变量 |
|
Unlock() |
允许其他用户修改 Application 变量 |
在实际操作中,Application 变量可以记录登录网站的用户,或网站已经登录的用户总数,至于每位用户状态则使用 Session 变量记录。
11.3.2 网站的访客计数
网站的访客计数是一种必备组件,其目的是显示有多少位访客曾经浏览网站,显示信息可以从开站以来的访客数,或一段时间内的访客数。
ASP.NET 的访客计数是在 Global.asax 文件的 Session_Start()事件处理程序中,使用 Application 变量记录访客计数,如下所示。
Application("HitCounter")=Application("HitCounter")+1
上述Application变量记录目前的访客计数,别忘了使用Lock()和Unlock()方法。
1. ASP.NET程序:Global.asax
在ASP.NET程序中实现网站访客计数的功能,使用Application对象的Lock()和Unlock()方法来创建访客计数,如下所示。
01: <%@ Application Language="VB" %>
02: <script Runat="server">
03: Sub Application_Start(ByVal Sender As Object,_
04: ByVal E As EventArgs)
05: ' 初始访客计数的Application变量
06: Application("HitCounter")= 1234
07: End Sub
08: Sub Session_Start(ByVal Sender As Object,_
09: ByVal E As EventArgs)
10: Application.Lock()
11: ' 创建访客计数
12: Application("HitCounter")=Application("HitCounter")+1
13: Application.Unlock()
14: End Sub
15: </script>
2. 程序说明
在Application_Start()事件处理程序中初始化访客计数,第6行初始化 Application变量值,Session_Start()处理程序在第12行将访客计数加1。
3. ASP.NET程序:Ch11-3-2.aspx
在ASP.NET程序中获取Application变量后,使用Label控件显示<img>标记的图形访客计数,如下所示。
01: <%@ Page Language="VB" %>
02: <script Runat="server">
03: Sub Page_Load(Sender As Object,E As EventArgs)
04: Dim str As String = "网站第 "
05: Dim i,counter,maxDigit,digit As Integer
06: maxDigit = 5
07: counter = Application("HitCounter")
08: For i =(maxDigit-1)To 0 Step -1
09: digit = counter \(10 ^ i)
10: str &="<img src=""Ch11-3-2BinaryWrite.aspx?Digit=" _
11: & digit & """>"
12: counter = counter MOD(10 ^ i)
13: Next
14: str &= "位访客<br>"
15: show.Text = str
16: End Sub
17: </script>
18: <html>
19: <head><title>Ch12-3-2.aspx</title></head>
20: <body>
21: <center><font color="red">
22: <form Runat="server">
23: <asp:Label Id="show" Runat="server"/>
24: </form>
25: </font></center>
26: </body>
27: </html>
4. 程序说明
第 7 行获取 Application 变量 HitCounter的值,第 8~13 行的循环建立访客计数值。
5. 网页预览
将Ch11\Ch11-3-2文件夹建立成虚拟目录后,启动浏览程序执行 Ch11-3-2.aspx 程序,可以显示图形的访客计数,如图11-6所示。

图11-6 Ch11-3-2.aspx运行结果
上图显示访客计数是1235位,重复启动浏览程序加载ASP.NET程序,可以看到访客计数增加,即增加Application变量HitCounter的值。
在ASP.NET程序中显示的数字图片是执行ASP.NET程序 Ch11-3-2BinaryWrite.aspx,即使用第 4 章的 BinaryWrite()方法来输出图片。







