HttpApplicationState与HttpApplication

HttpApplicationState 类的单个实例在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建。对于 Web 服务器上的每个 ASP.NET 应用程序都要创建一个单独的实例。然后通过内部 Application 对象公开对每个实例的引用。Application对象提供对所有会话的应用程序范围的方法和事件的访问。还提供对可用于存储信息的应用程序范围的缓存的 访问。HttpApplication对象负责触发应用程序事件。HttpApplication的属性Application用于获取应用程序的当前状 态HttpApplicationState的一个实例,换句话说:Application是HttpApplicationState的一个实例 。在ASP.NET下,应用程序状态有HttpApplicationState类型的一个实例维护。在创建可以被所有处于活动状态的会话共享的数据成员 时,需要建立一套名称/值对,即Application["xxx"]="xxx"这种形式。如果出现一组应用程序级变量必须作为一个单元更新的情况,要 使用Lock(),Unlock()来保证线程安全。HttpApplicationState类型可维护其所包含项的值,直到下列一种情形发生:最新登 陆到站点(?怎么是最新,应该是最后一个用户)的用户超时(或手动退出)或者某人通过IIS手动关闭了站点。(Application_End()事件处 理程序在应用程序关闭时被调用,这会在最后一个用户超时或者通过IIS手动关闭了应用程序的情况下发生)

HttpApplication 对象是经由HttpApplicationFactory.GetApplicationInstance(并最终调用 HttpRuntime.CreateNonPublicInstance)创建的HttpApplicationFactory它的主要任务是使用 URL 信息来查找 URL 虚拟目录和汇集的 HttpApplication 对象之间的匹配关系。

这个工厂类的行为概括为有以下几点

  1、工厂类维护, HttpApplication 对象池并使用它们来处理应用程序的请求。池的寿命与应用程序的寿命相同。

   2、应用程序的第一个请求到达时,工厂类提取有关应用程序类型的信息(global.asax 类)、设置用于监视更改的文件、创建应用程序状态并触发 Application_OnStart 事件。工厂类从池中获取一个 HttpApplication 实例,并将要处理的请求放入实例中。如果没有可用的对象,则创建一个新的 HttpApplication 对象。要创建 HttpApplication 对象,需要先完成 global.asax 应用程序文件的编译。

  3、HttpApplication 开始处理请求,并且只能在完成这个请求后才能处理新的请求。如果收到来自同一资源的新请求,则由池中的其他对象来处理。

  4、应用程序对象允许所有注册的 HTTP 模块对请求进行预处理,并找出最适合处理请求的处理程序类型。这通过查找请求的 URL 的扩展和配置文件中的信息来完成。

  HttpApplicationFactory.GetApplicationInstance创建HttpApplication实例中有三个关键方法:

   HttpApplicationFactory._theApplicationFactory.EnsureInited()  该方法检查HttpApplicationFactory是否被初始化,如果没有,就通过HttpApplicationFactory.Init()进 行初始化。在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax 进行编译。

  HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context)  创建特定的HttpApplication实例,触发ApplicationOnStart事件,执行ASP.global_asax中的Application_Start(object sender, EventArgs e)方法。这里创建的HttpApplication实例在处理完事件后,就被回收。

HttpApplication 是HttpRuntime所创建的吗? 并不是,HttpRuntime只是向HttpApplicationFactory提出请求,要求返回一个HttpApplication对象。 HttpApplicationFactory在接收到请求后,会先检查是否有已经存在并空闲的对象,如果有就取出一个HttpApplication对 象返回给HttpRuntime,如果没有的话,则要创建一个HttpApplication对象给HttpRunTime。

CSDN上的回答:

要区分开HttpApplication和HttpApplicationState
HttpApplicationState是整个应用程序唯一的。
而HttpApplication则不是唯一的。
HttpApplication不是指IIS上的一个应用程序。
HttpApplication和Session没有对应的关系。
HttpApplication实例和运行中的IHttpHandler实例是一对多的关系
对于每个请求。ASP.NET都会使用HttpApplication来处理。然后调用相应的IHttpHandler
对于并发请求,ASP.NET则会创建多个HttpApplication的实例。
请求完毕后,HttpApplication会被回收。然后再次使用。

每一次请求都会从池中获取一个HttpApplication对象,这个对象也许是新创建的,也许是闲置的,所以才会有应用程序池来维护已经创建的HttpApplication对象

一次请求都由一个HttpApplication对象来处理,在处理过程中,这个对象不能再处理其他请求,这时候有其他请求进来的话,就会被分配给其他
HttpApplication实例来处理,每当一个HttpApplication对象处理完请求,它就会回到池中,并置为闲置状态,以接收下一个请求
处理的任务

时间: 2024-10-15 02:25:59

HttpApplicationState与HttpApplication的相关文章

HttpApplication处理对象与HttpModule处理模块 (第三篇)

一.HttpApplication对象简述 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication. HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的时候,HttpApplicationFactory通过工厂模式管理HttpApplication对象.在HttpApplicationFactory内部维护了一个HttpA

特殊的HttpApplication事件处理

在global.asax中,针对HttpApplication的事件处理,可以通过定义特殊命名的方法来实现.首先,这些方法必须符合System.EventHandler,因为所有的HttpApplication管道事件都使用这个委托定义.第二,方法的作用域必须是public.第三,方法的命名格式必须如下:Application_注册的事件名称.按照这种命名方法定义在global.asax中的方法将被自动注册到对应的事件中. 例如,希望在global.asax中注册PostAuthenticate

HttpHandler,HttpApplication, HttpModule

选择HttpHandler还是HttpModule? HttpHandler和HttpModule之间有什么差别 之所以有这个疑问,是因为在这二类对象中都可以访问Request, Response对象,都能处理请求. 我原以为在博客 用Asp.net写自己的服务框架 中做了那么多的演示应该把它们的使用方法说清楚了, 然而有些人看了我的那些示例,仍然不知道该如何选择它们,为了实现同一个目标,我既用了HttpHandler,也有用HttpModule. 现在看来,我当时设计的那些示例并不是讲清楚Ht

并发请求时,HttpApplication的事件是如何执行的?

1 疑问: 如果系统里注册了一个HttpModule,在BeginRequest里编写了代码,执行时如果卡住,会影响其他请求的执行吗? 查阅MSDN的解释: http://msdn.microsoft.com/zh-cn/library/system.web.httpapplication(VS.80).aspx HttpApplication 类的实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的.HttpApplication 类的一个实例在其生存期内被用于处理多个请求,但它

ASP.Net 重写IHttpModule 来拦截 HttpApplication 实现HTML资源压缩和空白过滤

务实直接上代码: 1. 重写FilterModule.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web; 7 using System.Text.RegularExpressions; 8 using System.IO.Compression; 9 1

HttpApplication、HttpContext、HttpModule、HttpHandler

http://www.cnblogs.com/ljzforever/archive/2010/03/07/1680311.html http://runboliu.blog.163.com/blog/static/13459317201101352357218/ HttpApplication.HttpContext.HttpModule.HttpHandler,布布扣,bubuko.com

HttpApplication中的异步线程

一.Asp.net中的线程池设置 在Asp.net的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求,请求的处理过程将被排入线程池中,对于Asp.net来说,在Machine.config文件的processModel部分中可以设置线程池中的参数. Asp.net线程相关的参数配置: 参数 配置 autoConfig 基于服务器的配置自动设置. maxWorkerThreads 设置每个CPU的最

第37篇 Asp.Net源码解析(二)--详解HttpApplication

这篇文章花了点时间,差点成烂到电脑里面,写的过程中有好几次修改,最终的这个版本也不是很满意,东西说的不够细,还需要认真的去看下源码才能有所体会,先这样吧,后面有时间把细节慢慢的再修改.顺便对于开发的学习,个人是觉得源码的阅读是最快的提高方式,当然阅读不是走马观花,应该多次阅读. 上次说到获得HttpApplication对象的创建,创建完成后调用InitInternal方法,这个方法任务比较多,也比较长,这里就不贴全码了,一个一个过程的去说: 初始化HttpModule 对于HttpModule

HttpApplication的处理管道19个事件。

HttpApplication对象是由Asp.net帮助我们创建的,它是asp.net中处理请求的重要对象.为了便于扩展,HttpApplication采用处理管道的方式进行处理,将处理的步骤分为多个步骤,每个步骤通过事件的形式暴露给程序员,这些事件按照固定的处理顺序依次触发,程序员通过编写事件处理方法就可以定义一个请求的扩展过程. 对于HttpApplication,到ASP.NET 4.0,提供了19个标准事件. 1.BeginRequest:asp.net开始处理请求的第一个事件,表示处理