11.1 Application对象
Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束,Application对象被自动撤销。因此Application对象中的变量也有相同生存期,并且变量可以被Web应用程序中的所有网页访问。因此,可以在Application对象中建立一些全局的公用变量,由于存储在Application对象中的数值可以被应用程序的所有网页读取,所以Application对象的属性也适合在应用程序的网页之间传递信息。Application对象主要有以下用途:
l 存储记录在线人数或访问网站总人数的变量。
l 存储网站共用最新消息,供所有网页更新。
l 记录网站中个网页同一条广告被点击的次数或时间。
l 存储供所有网页使用的数据库数据。
l 不同用之间通讯,例如多用户聊天室,多用户游戏等
本节首先介绍Application对象的用法,然后介绍记录访问网站总人数的实现方法。
11.4.1 Application对象属性
虽然Application对象没有内置的属性,但我们可以使用以下句法设置用户定义的属性也可称为集合:Application("属性/集合名称")=值,例如,Application("MyVar")="Hello"。用以下语句取出数据:string s= Application("MyVar")。
11.4.1 方法
Application 对象有两个方法,它们都是用于处理多个用户对存储在Application中的数据进行写入的的同步问题。由于存储在Application对象中的数值可以被应用程序的所有网页读取,因此一个用户在修改这个变量时,不允许其它用户修改,这两个方法就是解决这个问题的。
l L ock 方 法
Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。
l Unlock 方法
和Lock方法相反,Unlock方法允许其他客户修改Application对象的属性。下例介绍一个计数器变量的使用方法。
Application.Lock;
Application["counter"]=(Int32)Application["counter"]+1;
Application.UnLock;
11.4.1 事件
l Application_OnStart事件
第一个浏览器访问Web应用程序网页时,产生的事件。
l Application_OnEnd事件
没有浏览器访问时Web应用程序网页时,产生的事件。
Application_OnStart和Application_OnEnd事件的处理过程必须写在global.asax文件之中。
11.4.2 例子:显示访问网站总人数
(1) 建立一个主页文件Default.aspx如下:
<html>
<script language="c#" runat=server>
void Page_Load(Object src,EventArgs e)
{
if(!Page.IsPostBack)//如果用户单击刷新按钮,计数器不加1
{
int num;
Application.Lock;
Application["counter"]=(Int32)Application["counter"]+1;
num=(Int)Application["counter"];
Application.UnLock;
label1.Text=Convert.ToString(num);
}
}
</script>
<body>
<form runat=server>
<asp:Label id="label1" Text="" runat=server></asp:Label>
<br>
<asp:HyperLink id="hLink1" NavigaterUrl="other.aspx" Target="_blank" runat=server>
单击此处转到e1.aspx,计数器不加1。
</asp:HyperLink >
</form>
</body>
</html>
(2) 建立other.aspx网页文件如下:
<html>
<script language="c#" runat=server>
void Page_Load(Object src,EventArgs e)
{
Int num=(Int)Application["counter"];
label1.Text=Convert.ToString(num);
}
}
</script>
<body>
<form runat=server>
<asp:Label id="label1" Text="" runat=server></asp:Label>
<br>
<asp:HyperLink id="hLink1" NavigaterUrl="default.aspx" runat=server>
单击此处转到dault.aspx,计数器不加1。
</asp:HyperLink >
</form>
</body>
</html>
(3) 建立global.asax文件如下:
<script language="c#" runat=server>
void Application_OnStart(Object src,EventArgs e)
{
Application.Add("counter",0);
}
</script>
(4) 三个文件都存到宿主目录中,在浏览器重输入URL地址:http://Localhost/,查看显示的计数器数值,单击刷新按钮,查看显示的计数器数值是否改变,转到Other.aspx网页,在转回dault.aspx网页,查看显示的计数器数值是否改变。关闭所有网页,在打开default.aspx网页,显示的计数器值从0开始,这是因为没有网页访问网站时,Application对象被自动撤销。在打开新网页,产生Application_OnStart事件,将counter值为0。为了解决此问题,可以建立一个文件,记录访问网站总人数,初值为0,Application_OnStart事件函数中,从文件取出已访问网站总人数,赋值给counter,Application_OnEnd事件函数中,将counter存到文件中。
(5) 用记事本创建文件counter_File.txt,其中内容为字符0。存文件到宿主目录中。
(6) 修改global.asax文件如下:
<script language="c#" runat=server>
void Application_OnStart(Object src,EventArgs e)
{//用Server对象对象得到counter_File文件绝对路径
string s=Serve.MapPath(counter_File.txt);
Application.Add("counterFile",s);//保存供Application_OnEnd事件函数使用
System.IO.FileStream fs=new System.IO.FileStream("s",FileMode.OpenOrCreate);
System.IO.StreamReader r=new System.IO.StreamReader(fs);
s=r.ReadLine();
r.Close();
Application.Add("counter",Convert.ToInt(s));
}
void Application_OnEnd(Object src,EventArgs e)
{//此时Server对象已不存在,无法用Server对象得到counter_File文件绝对路径
string s= (string)Application("counterFile");//取出保存的计数文件的全路径地址
System.IO.FileStream fs=new System.IO.FileStream("s",FileMode.OpenOrCreate);
System.IO.StreamWrite w=new System.IO.StreamWrite(fs);
int num=(int)Application("counterFile");
w.Write(num.ToString());
w.Close();
}
</script>
(7) 再一次访问dault.aspx网页,看是否已解决以上提出的问题。这里还有一个问题,如果用用如下URL访问网页:http://Localhost/Other.aspx,这样计数器就不能计数,解决的方法见Session 对象一节。