从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) = {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对象通过获取读写锁已经内在的提供了线程安全保证。

比较安全的初始化全局静态成员变量的地方是在Application_Start事件处理程序中。即使全局范围有很多个Global对象的实例,运行时只会在Global对象第一次创建的时候调用Application_Start事件处理程序。

比较理想的初始化请求状态变量的地方是Application_BeginRequest,请求状态变量一般情况下不需要线程安全,因为每个Global对象在同一时刻只服务于一个请求

转载于:https://www.cnblogs.com/JoinZhang/archive/2010/08/12/1798082.html

HttpApplication类及派生的Global类相关推荐

  1. C++编程练习:多态实验——设计一个基类Shapes,Shapes类公有派生产生矩形类Rectangle和圆类Circle

    例.设计一个基类Shapes,包含成员函数display()并声明为纯虚函数.Shapes类公有派生产生矩形类Rectangle和圆类Circle,分别定义display()函数实现其主要几何元素的显 ...

  2. Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...

    [单选题]设 x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( ) [判断题]构造函数的方法名可以由编程人员任意命名. [单选题]能够实现对原文的鉴别和不可否认性的认证技术是( ). [单 ...

  3. 【 定义一个长方形Rect类再派生出长方体类Cub】

    [问题描述]定义一个长方形Rect类,派生出长方体类Cub,计算派生类对象(长方体)的表面积和体积. [输入形式]长方体对象的长.宽.高. [输出形式]输出该长方体的表面积和体积. [样例输入] 输入 ...

  4. C++构造函数基于Rectangle类并派生Cuboid长方体类

    题目:1.设置一个名为Rectangle的类表示矩形.这个类包括: (1)两个名为length和width的float型数据域.他们分别表示矩形的长和宽: (2)创建length和width为指定值的 ...

  5. 练练手:建立一个形状类Shape作为基类,派生出圆类Circle和矩形类Rectangle,求出面积并获取相关信息。

    这个简单的小程序是对类的继承做的一个小巩固 要求如下: (1)形状类Shape (a)保护数据成员 double x,y:对于不同的形状,x和y表示不同的含义,如对于圆,x和y均表示圆的半径,而对于矩 ...

  6. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  7. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

  8. python-子类和派生、继承

    新式类和经典类得区别: ################################################### class ClassicClass(): pass class New ...

  9. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

最新文章

  1. Ajax---使用json数据格式输出数据
  2. SAP MM 采购报表中Delivery Date的显示
  3. java实现文件名过滤器接口_Java使用文件过滤器FileFilter、FilenameFilter搜索文件
  4. java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)
  5. 蓝牙配对模式 java_BLE(低功耗蓝牙)配对和绑定
  6. 24dian(牛客多校第三场)
  7. LeetCode 1662. 检查两个字符串数组是否相等
  8. 那个悲伤的朋友,去了一趟菜场竟然活过来了
  9. [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流
  10. idea新建java工程
  11. Airflow 中文文档:实验性 Rest API
  12. 排序算法之 Shell Sort
  13. 28个数控编程代码大全,众多程序员呕心沥血的私货
  14. JAVA API帮助文档
  15. oracle导入dmp文件出错,IMP导入时的错误以及解决办法
  16. Whisper的应用
  17. 使用流报错:stream has already been operated upon or closed
  18. 【Excel】数据透视表—数据透视表布局(显示)
  19. 高中数学培训高中数学必修一
  20. 《Microduino实战》——3.6 RGB彩色LED——彩色的世界

热门文章

  1. 加拿大文件服务器,加拿大服务器空间
  2. 华为的型号命名规则_电力电缆产品的型号命名规则
  3. 从零开始学计算机组装与维修技术,从新手到高手:电脑组装、维护与故障排除...
  4. IntelliJ IDEA启动Tomcat控制台乱码问题解决
  5. python续行_python中如何优雅续行和换行
  6. java array 元素的位置_java中的两种排序工具Arrays和Collections的使用
  7. C语言控制结构程序设计,第3讲 C语言程序的基本控制结构_C语言程序设计(上)_pps_大学课件预览_高等教育资讯网...
  8. consul php,go-micro+php+consul实现简单的微服务
  9. linux查看通信延迟,低优先级进程延迟实时进程中的串行通信(Linux)
  10. mysql实例化_MySQL如何通过实例化对象参数查询数据 ?(源代码)