application对象(httpapplicationstate 类型,译者按:application对象是httpapplication类的一个属性,是web应用程序全局唯一的,web应用程序第一次有请求进来的时候创建的) 是我们在web应用程序内保存全局信息的地方,application对象是一个很方便的保存全局信息的地方,例如保存数据库教程的连接字符串:
private void page_load(object sender, system.eventargs e)
{
string connectionstring = application["connectionstring"].tostring();
. . .
}
你也可以在httpapplication类中声明静态成员变量来保存应用程序状态信息,例如,上例中的数据库连接字符串可以用如下方式保存。
public class global : system.web.httpapplication
{
public static readonly string connectionstring = "connection information";
. . .
}
可以在asp教程.net代码的任何地方访问该静态成员变量,例如:string connectionstring = global.connectionstring;
非常重要的一点是,如果你想让该字符串可以全局范围内被访问到,则该字符串必须声明为静态成员变量(你也可以创建一个静态的属性)。
相反,如果你在global类型使用一般成员变量(非静态),则只能用来保存请求状态,举个例子来说明,下面的代码将在调试窗口中输出所有请求的处理时间(毫秒)
public class global : system.web.httpapplication
{
protected datetime beginrequesttime;
protected void application_beginrequest(object sender, eventargs e)
{
beginrequesttime = datetime.now;
}
protected void application_endrequest(object sender, eventargs e)
{
string messageformat = "elaps教程ed request time (ms) = {0}";
timespan difftime = datetime.now - beginrequesttime;
trace.writeline(
string.format(messageformat, difftime.totalmilliseconds ) );
}
. . .
}
好,现在让我们回到上面关于保存应用程序状态的话题。那个方法更好的呢:在application对象中保存对象的引用,还是在global类中声明静态成员或属性?各种方式各有优劣。在global类中保存全局静态成员可以使你的数据访问具有强类型,不象application对象,你不需要进行类型转换,下面的代码说明了它们的区别:
dataset cacheddata = (dataset)application[“mydataset”];
string mystring = application[“mystring”].tostring();
dataset cacheddata = global.mydataset;
string mystring = global.mystring;
强类型使你的的代码更加清晰和强壮,在应用程序性能要求比较高的情况下,这种方式可以避免运行时类型转换带来的性能损失。如果你保存的是值类型的数据,强类型还可以避免装箱(boxing)和卸箱(unboxing)所带来的性能损失。另外,application对象还有因为线程同步造成的锁定所带来的性能上问题。如果你的全局数据只初始化一次,再也不会改变,使用global类中的静态成员可以避免锁定带来的性能损失。但,如果你采用了这种方式,强烈推荐你使用访问器(属性),以保证该变量是只读的。如果你既要读又要写在global类中的静态成员变量,记住要保证线程安全。application对象通过获取读写锁已经内在的提供了线程安全保证。
看一下利用asax文件做网站计数器
添加了global.asax,app_code文件夹下global.asax.cs,文本文件site_counter.txt并写入数字0,代码分别如下:
global.asax
<%@ application inherits="linker.global" language="c#" %>
global.asax.cs
using system;
using system.data;
using system.configuration;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.io;
namespace linker
...{
/**//// <summary>
/// global 的摘要说明
/// </summary>
public class global : httpapplication
...{
public global()
...{
//
// todo: 在此处添加构造函数逻辑
//
}
protected void application_start(object sender, eventargs e)
...{
// 在应用程序启动时运行的代码
streamreader rd = new streamreader(server.mappath("site_counter.txt"));
application.lock();
application["site_counter"] = int.parse(rd.readline());
application.unlock();
rd.close();
}
protected void session_start(object sender, eventargs e)
...{
// 在新会话启动时运行的代码
application.lock();
application["site_counter"] = convert.toint32(application["site_counter"]) + 1;
application.unlock();
streamwriter wt = new streamwriter(server.mappath("site_counter.txt"), false);
application.lock();
wt.writeline(application["site_counter"]);
application.unlock();
wt.close();
}
}
}
然后在需要显示的页面显示系统 就可以了
比如简单的:
label_site_counter.text = convert.tostring(application["site_counter"]);