首页 新闻 会员 周边

Global.asax构造函数问题

0
[已关闭问题] 关闭于 2018-09-21 15:52

Global.asax中有一堆的事件处理,比如Application_Start,除此之外,当然有其自身的构造函数
public Global(){}

现在有个问题,就是该构造函数什么时候会被执行呢。讲道理,构造函数应该是实例化的时候执行。那么什么时候实例化呢?
问题产生:当我并发访问一个接口的时候,发现该构造函数是会被执行多次的,而Application_Start是随着IIS启动而在应用运行期间只执行一次。然后再次并发去访问接口,这个构造函数又不会被执行了。猜测应该是跟多次请求,分配的进程资源有关。

有大神了解过这个吗?

大兄弟竹子的主页 大兄弟竹子 | 初学一级 | 园豆:55
提问于:2018-09-21 15:51
< >
分享
所有回答(1)
0

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 实例,以这个为框架基础。

大兄弟竹子 | 园豆:55 (初学一级) | 2018-09-21 15:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册