清华电脑学堂:ASP.NET 4.5网站开发与应用实践教程
上QQ阅读APP看书,第一时间看更新

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页面并查看效果,效果图不再显示。