发布网友 发布时间:2023-08-06 17:07
共1个回答
热心网友 时间:2024-12-12 16:47
从HttpApplication派生的Global 类有很多用处 包括管理应用程序状态和请求状态
Visual Studio NET 创建的global asax文件为每个web 应用程序生成一个从HttpApplication类派成的Global类 这个类包含很多事件处理程序 例如Application_Start和 Session_Start
或许有人认为每个web应用程序只有一个Global类的实例 事实上 在大多数应用程序框架中 代表 Application 的对象都是singleton – 就是说只有一个实例存在 我们也知道ASP NET运行时只有在应用程序开始的时候才调用Application_Start事件处理方法 所有这些好像都在暗示 在我们的ASP NET Web应用程序中只有一个Global对象的实例 但是所有这些确确实实是误导!
ASP NET 运行时(ASP NET runtime 以下简称 运行时 )维护了一个HttpApplication对象池 当一个请求进来的时候 运行时从该池中取出一个HttpApplication对象来服务于当前请求 该HttpApplication对象一直和该请求相关联 且只和该请求相关联 直到请求被处理完毕 当请求完成后 运行时把该对象归还到池中 稍后会从池中再次取出去服务于另外的请求 但一个请求每次只能和某一个HttpApplication对象相关联
Application State VS Request State
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 = Elapsed request time (ms) = { } ;
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对象通过获取读写锁已经内在的提供了线程安全保证
比较安全的初始化全局静态成员变量的地方是在Application_Start事件处理程序中 即使全局范围有很多个Global对象的实例 运行时只会在Global对象第一次创建的时候调用Application_Start事件处理程序
lishixin/Article/program/net/201311/12735