为何出现零散的Application_Start调用却无对应的Application_End?
以下是几种可能导致无关联HTTP请求时Application_Start被触发的常见原因,以及对应的排查方向:
应用池自动回收:IIS应用池默认自带自动回收机制,比如按固定时间间隔(默认29小时)、虚拟内存/专用内存阈值、CPU使用率阈值触发回收。回收时旧进程会被终止,新进程启动后就会触发Application_Start。这类回收往往发生在低峰时段,可能和你看到的零散日志时间点吻合。
排查:打开IIS管理器,找到目标应用池的「高级设置」,查看「回收」板块的各项参数,同时确认「生成回收事件日志」是否开启——如果开启,可在事件查看器中找到对应时间的回收日志,和Application_Start的时间戳做比对。进程意外崩溃:应用程序进程可能因未处理的异常、内存泄漏、资源访问失败等原因崩溃,IIS会自动重启进程,进而触发Application_Start。
排查:打开Windows事件查看器,定位到「Windows日志 -> 应用程序」,筛选来源为.NET Runtime、IIS-W3SVC-WP、ASP.NET的事件,查找对应Application_Start时间点的错误记录,这类日志会明确说明进程终止的原因。应用池闲置超时:如果应用池设置了闲置超时(默认20分钟),超过时长无请求时,IIS会关闭应用进程。之后若有后台任务(比如定时缓存刷新、第三方服务的静默回调)触发进程启动,就会出现无对应前端HTTP请求的Application_Start日志。
排查:在应用池高级设置中查看「闲置超时(分钟)」参数,同时检查应用是否有后台定时任务或第三方服务的回调配置。服务器资源耗尽:当服务器内存不足、CPU负载过高时,Windows可能会强制终止占用资源过多的进程,IIS随后会重启应用池进程,触发Application_Start。
排查:用Windows性能监视器,查看对应时间点的内存、CPU、磁盘IO使用率,确认是否存在资源耗尽的情况。应用池身份权限问题:如果应用池的运行身份权限不足,在访问某些资源(比如数据库、特定文件目录)时可能导致进程异常终止,IIS重启进程后触发Application_Start。
排查:检查应用池运行身份是否拥有应用所需的全部资源访问权限,比如数据库连接权限、文件读写权限等。
内容的提问来源于stack exchange,提问作者Jim

