Global.asax使用介绍

 我来答
温屿17
2022-11-15 · TA获得超过1.2万个赞
知道小有建树答主
回答量:827
采纳率:0%
帮助的人:95.5万
展开全部

  从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事件处理程序

lishixinzhi/Article/program/net/201311/12735

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
因斯蔻浦(上海)生物科技有限公司
2020-04-25 广告
Inscopix是全球先进的钙成像显微镜厂商,提供nVista和nVoke系统,清醒自由行为动物神经元钙显微成像的黄金标准,提供了大视野、神经元分辨率、1000多个神经元同时成像的优质钙成像信息。想了解更多相关信息,可以咨滔博生物www.t... 点击进入详情页
本回答由因斯蔻浦(上海)生物科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式