ASP.NET MVC中Application_Start()事件的触发时机是什么?
Application_Start()触发时机逻辑说明 核心触发规则
Application_Start()是ASP.NET生命周期内仅在应用初始化阶段执行一次的事件,官方定义里的“应用启动”,既不是IIS服务启动的时刻,也不是IIS中应用/应用池重启完成的时刻,而是应用对应的AppDomain初始化完成后,收到第一个发往该应用的有效HTTP请求的时刻。
几个易混淆场景的对应规则:
- IIS服务整体启动:如果启动后没有任何请求路由到目标MVC站点,应用不会主动初始化,
Application_Start()不会执行 - IIS中手动重启站点/重启应用池:重启动作只是销毁旧的工作进程、做好接收新请求的准备,不会主动初始化应用,没有请求进入时
Application_Start()不会触发 - 首个用户发起请求:这是绝大多数常规场景下
Application_Start()的实际触发点,IIS收到第一个匹配站点路由的请求时,会先加载应用运行环境、初始化AppDomain,执行Application_Start()中的所有注册逻辑(比如路由注册、过滤器注册、依赖注入配置等),完成后才会把请求送入MVC处理管道。
关闭浏览器后的触发判断
首先要明确一个基础逻辑:HTTP协议是无状态的,用户关闭浏览器的动作本身不会被服务器感知,服务器也不会因为“没有用户保持浏览器打开”就判定应用需要停止。
后续访问会不会触发Application_Start(),唯一判断标准是当前应用对应的AppDomain是否已经被卸载回收:
- 如果只是所有用户都关闭了浏览器,但没有触发AppDomain回收,后续任何用户再访问站点,都不会触发
Application_Start(),应用会直接处理请求 - 如果在无请求期间触发了AppDomain回收,那么回收后的第一个请求抵达时,会重新执行
Application_Start()。常见的AppDomain回收触发条件包括:- 应用池配置的空闲超时到达(IIS默认配置为20分钟无任何请求时,自动回收空闲工作进程释放内存)
- 站点bin目录下的程序集文件、
web.config等核心配置文件被修改,触发ASP.NET热重启机制 - 应用池达到配置的固定回收周期、内存占用阈值、CPU占用阈值,自动触发工作进程回收
- 管理员手动在IIS面板执行站点重启、应用池重启、应用池回收操作
回到你提到的具体场景:如果唯一的用户关闭浏览器后,在应用池空闲超时时间内就再次访问,不会触发Application_Start();如果间隔时间超过了空闲超时配置,或者期间触发了其他回收条件,那么这次访问作为回收后的第一个请求,就会触发Application_Start()。
内容的提问来源于stack exchange,提问作者Hasan Shouman
相关产品推荐
相关产品推荐

