问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Global.asax使用介绍

发布网友 发布时间: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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
邪灯是什么意思? 趣头条怎么解绑微信 趣头条APP解绑微信教程 趣头条怎么解绑微信号 趣头条怎样解除微信绑定 魔兽世界7.0古龙之陨怎么做 咸阳男子欲带孩子轻生被救回,成年人的生活有多不易? 陕西咸阳,一男子欲带孩子轻生被救回,轻生带孩子是什么操作? 我是帅哥,为什么还没有人追? 为什么我这么漂亮就是没有一个男人来追我 气死了? 人不在本地,怎么实名制 global affairs是什么意思 神州租车二手车可以买吗 联想zuk Edge臻享版和联想乐檬X3哪个好? 10款crv2.4的座椅加热的保险丝在哪里 Cisco 安装时提示error 1722.错误 汝阳县大安乡大安村翟向盘的电话? 我的麾托车他说没有禁令标记扣车了,为什么要十五日之后处理呢_百度知 ... 每天不吃面食只吃清淡的会瘦吗 长安金牛星轮胎中间的长安标记扣哪里能买到 石昊一生命运几何? 跪求唐宋浙江籍的诗人 Cisco 安装时提示error 1722.错误 永骄科技获客软件怎么样 袁涣是什么样的人?袁涣多次易主为何还以忠义著称? 他受刘备任用曾为其抗争,却终成为曹魏大臣,去世后曹操为何为他落泪呢... 袁涣曾被刘备推举,后还受命袁术,甚至曾依附吕布,他是怎么做到的? 如何维护保养真空冻干机 人不长志。天难救也。写后语是什么? 求生之路服务器怎么设置公告 初中生懒怎么办 兑换墨西哥航空的里程 菏泽高铁为什么不到郑州 出生在何地用英语怎么说 《追妻计划:老婆别逃!(全本)》txt全集下载 ...散文和写景状物散文,那么做散文的一般思路是什么? Cisco 安装时提示error 1722.错误 比最大六位数多1是多少?比最小六位数少1是多少?它们的差多少,它们的和... 华中民族大学是211吗 湖北民族大学所在城市气候怎么样? 名列前茅一般指前几 名列前茅指前几名 成绩在全班前十是名列前茅吗? 产妇能吃黑米,核桃,黑芝麻,枸杞吗 我数学不好能学生物吗 ...英语 地理 美术 生物 化学 政治 历史 相互联系吗 生物和应用数学有关系吗 学汉语的方法有哪些 哪里回收翡翠价格公道? dog的复数形式 有一首和许嵩的 多余的解释 调一样的歌叫什么名字? 户外游戏投彩球