Global.asax中有一堆的事件处理,比如Application_Start,除此之外,当然有其自身的构造函数
public Global(){}
现在有个问题,就是该构造函数什么时候会被执行呢。讲道理,构造函数应该是实例化的时候执行。那么什么时候实例化呢?
问题产生:当我并发访问一个接口的时候,发现该构造函数是会被执行多次的,而Application_Start是随着IIS启动而在应用运行期间只执行一次。然后再次并发去访问接口,这个构造函数又不会被执行了。猜测应该是跟多次请求,分配的进程资源有关。
有大神了解过这个吗?
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 实例,以这个为框架基础。