问题描述
当一个请求到达时,HttpApplicationFactory会从HttpApplication对象池中分配一个HttpApplication对象用于处理这个请求。1、在应用程序中,第一次的请求到达时,会先初始化HttpApplicationFactory,在初始化过程中,会提取Global.asax类的信息(调用Application_Start方法),然后HttpApplicationFactory会从HttpApplication对象池中分配一个HttpApplication对象,但由于是第一次访问,此时对象池中不存在可以分配的HttpApplication对象,所以HttpApplicationFactory会创建一个HttpApplication对象用于处理当前请求,HttpApplication在创建过程中会经过各种HttpModule进行事件注册。2、在第一次请求还未结束时,第二个请求到达,此时由于对象池中只有一个HttpApplication对象,但此对象仍在处理第一个请求,所以此时HttpApplicationFactory又会创建一个新的HttpApplication对象,同样,会对该HttpApplication对象进行初始,经过各种HttpModule进行事件注册。我现在搞不清楚Global.asax与HttpApplication对象是什么关系。a、已知的是Global.asax是派生HttpApplication类的。那HttpApplicatonFactory每次请求创建的新的HttpApplication对象是否是Global.asax的实例对象呢?b、Gobal.asax到底有什么作用,仅仅是用于应用程序第一次请求时进行应用程序全局的一些操作?c、这里红线的意思是,HttpApplication对象就是Global.asax的实例,那么一个应用程序中不就会存在多个Global对象,Application_Start应用程序为什么只会执行一次?求解答呀,很费解呀!!!谢谢!!!
解决方案
本帖最后由 u011964267 于 2015-09-11 21:40:39 编辑
解决方案二:
自己顶一个呀,帮忙解答一下呀,各位
解决方案三:
使用工厂类就是在不能确定最终生成的是哪一个类时使用的,此处当然就是Global类Global类里有些什么东西,那就是它的作用,至于你用不用是另外一回事.如果懂了继承就知道Global的实例就是HttpApplication实例,但如果销毁了再生成,Application_Start就不止会运行一次了.
解决方案四:
引用2楼tcmakebest的回复:
使用工厂类就是在不能确定最终生成的是哪一个类时使用的,此处当然就是Global类Global类里有些什么东西,那就是它的作用,至于你用不用是另外一回事.如果懂了继承就知道Global的实例就是HttpApplication实例,但如果销毁了再生成,Application_Start就不止会运行一次了.
如你所说,当应用程序最初进来的3个请求,如没有application对象池中没有复用的httpapplication对象,则会创建3个httpapplication对象,也就是global实例?既然是这样,都有3个global实例了,何谈什么全局?而且即然有3个实例了,为何只有一个globa实例会执行application_start方法呢?另个2个不执行了?或者是否可以这样说,只有应用程序的第一个请求时才会调用global中的application_start方法?通过什么方法来保证这样的机制?我所知的方法有个是静态构造,只会调用一次。
解决方案五:
引用楼主u011964267的回复:
a、已知的是Global.asax是派生HttpApplication类的。那HttpApplicatonFactory每次请求创建的新的HttpApplication对象是否是Global.asax的实例对象呢?b、Gobal.asax到底有什么作用,仅仅是用于应用程序第一次请求时进行应用程序全局的一些操作?c、这里红线的意思是,HttpApplication对象就是Global.asax的实例,那么一个应用程序中不就会存在多个Global对象,Application_Start应用程序为什么只会执行一次?
a.IIS通过ISAPI然后通过asp.net引擎启动的用于处理页面请求的,应该就是。b.每一个请求都会使用一个HttpApplication实例。可能你以为一个asp.net网站总共只需要一个实例,这是错误的!每一个请求都需要一个实例,这样就能并发多用户访问。这有点像是ADO.NET的连接池一样似地,多个并发请求都访问同一个连接字符串的标记的数据库,看似只公共同一个Dbconnection实例就行了,而实际上是连接池可以有多达200个实例。HttpApplication也是这样,每一个HttpContext上下文对象都会被分配有一个独立的HttpApplication。只有当当前系统的线程池的可用线程低于某个在asp.net系统中规定的数值时,asp.net才会将请求放入Queue,以后再处理;否则就会动态地反射创建一个新的HttpApplication实例。因此你把HttpApplication看成仅仅是什么“全局操作”,这是错误的。它是针对每一次并发请求而设计的代理,只不过让你以为是同步非并发的。c.Application_Start执行一次,这不代表着它的宿主对象就是只能有一个。asp.net只对第一个HttpApplication实例才通知其调用其能够触发这个事件的方法,不代表着它就只有一个实例。
解决方案六:
否则就会动态地反射创建一个新的HttpApplication实例-->否则就会获取一个旧的或者反射创建一个新的HttpApplication实例软件架构往往都是千百次重构的结构,随着功能和性能要求的改变不断改变架构设计。因此有时候你需要理解别人的架构,而不是按照自己的想象来要求架构是什么样子的。因此我们看一个系统,不是仅仅看文字说明,必须看源代码。
解决方案七:
而实际上是连接池可以有多达200个实例-->而实际上是连接池可以有多达逻辑连接200个实例你最主要的误会就出HttpApplication多实例的问题上。同一个asp.net应用会在必要时使用超过100个HttpApplication实例,以这个为框架基础。