ASP.NET应用程序级别与会话级别和Global.asax ...混淆

时间:2011-01-08 18:48:57

标签: asp.net asp.net-4.0 application-lifecycle

以下文字来自我正在阅读的书“MCTS Self-Paced Training Kit(考试70-515)使用ASP.NET 4进行Web应用程序开发”。它给出了应用程序生命周期的概述。

  
      
  1. 用户首先请求您网站中的网页。
  2.   
  3. 请求被路由到处理管道,处理管道将其转发到ASP.NET运行时。
  4.   
  5. ASP.NET运行库创建ApplicationManager类的实例;此类实例表示将用于执行应用程序请求的.NET框架域。应用程序域将全局变量与其他应用程序隔离,并允许每个应用程序根据需要单独加载和卸载。
  6.   
  7. 创建应用程序域后,将创建HostingEnvironment类的实例。此类提供对托管环境中项目的访问,例如目录文件夹。
  8.   
  9. ASP.NET创建将用于处理请求的核心对象的实例。这包括HttpContext,HttpRequest和HttpResponse对象。
  10.   
  11. ASP.NET创建HttpApplication类的实例(或重用实例)。此类也是站点的Global.asax文件的基类。您可以使用此类来捕获应用程序启动或停止时发生的事件。当ASP.NET创建HttpApplication的实例时,它还会创建为应用程序配置的模块,例如SessionStateModule。
  12.   
  13. 最后,ASP.NET通过HttpApplication pipleline处理请求。此管道还包括一组用于验证请求,映射URL,访问缓存等的事件。
  14.   

然后,本书演示了使用Global.asax文件的示例:

   <script runat="server">
void Application_Start(object sender, EventArgs e)
{
Application["UsersOnline"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
Application.UnLock();
}
</script>

申请何时开始?会话和应用程序级别之间有什么区别?我对如何管理感到困惑。我认为应用程序级别类“位于”AppDomain对象之上,而AppDomain包含特定于该用户的该会话的信息。有人可以解释IIS如何管理Applicaiton级别的类,以及HttpApplication类如何位于AppDomain下?一切都很受欢迎。

1 个答案:

答案 0 :(得分:3)

AppDomain以外没有任何东西存在,所以HttpApplication当然必须在其中实例化。

步骤3到6仅在应用程序的生命周期内发生。当创建ApplicationManager实例时,不会再次为下一个请求创建实例。 HostingEnvironmentHttpApplication也是如此。这意味着存储在Application-collection中的值将保留在那里以获取应用程序生命周期内的所有后续请求。

每个应用程序只有一个AppDomain,而不是每个会话或每个请求。