应用程序结束全局.asax。

46

有人能告诉我应用程序的生命周期中何时触发Application_End事件?当所有会话结束时,Application_End是否会自动触发? + Application_End可能被触发的其他原因有哪些?


2
我删除了我的回答,即Application_End只在关闭网站时触发。然而,几分钟的研究却得出了关于这个问题的矛盾信息,我不想因为回答错误而被踩。 - Cybis
1
这不是对你问题的回答,但这是一个有用的工具,可以帮助你调查是否发生了这个事件,如果你不确定原因:http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx - Tao
3个回答

40

application_end事件主要在IIS池被回收或应用本身被卸载时触发。值得注意的另一点是,依赖文件(比如web.config)的更改将导致应用程序重新加载自身,因此在关闭自身时也会触发application_end事件。

需要注意的是,我找到的唯一一个应用程序结束事件在最后一个用户会话超时时触发的实例是在2001年的一些旧文档中。我不确定这个标准是否仍然适用。


2
我注意到当web.config被修改时,可能需要几分钟才会触发application_end。 - an phu
针对@anphu的观点,当应用程序由于配置更改(或DLL更改)而重新加载时,通常会有一段时间,旧实例和新实例同时运行,因为旧实例正在处理其现有请求;这在http://odetocode.com/articles/305.aspx中得到了很好的解释-这是本主题的好读物。 - Tao
如果我使用msi包安装了Web应用程序,然后通过命令提示符卸载它,是否会调用应用程序的结束函数? - OldSchool
@Dillie-O 我在测试这个,但是有一个奇怪的观察结果。在我的 Application_End 中,我需要调用一个 WCF 服务。有时它能够调用,其他时候它会抛出类型初始化异常。我的 WCF 引用在另一个项目中,而不是 Web 应用程序本身(调用 WCF 服务的地方)。我已经在 Web.config 中配置了 WCF 服务端点。但是我不确定为什么有时候可以调用,有时候不行。我怀疑是 Web 服务项目(从客户端)卸载和调用 Application_End 在竞争?有什么想法吗? - OldSchool
@YakRangi - WCF服务位于何处,为什么您需要在Application_End中调用它?一般来说,该事件不应用于复杂操作,因为Web应用程序处于“关闭”状态。通常情况下,您使用它来释放可能正在使用的本地资源。 - Dillie-O
显示剩余2条评论

12

Application_End会在ASP.NET工作进程终止时触发。这通常在一段可配置的不活动期后或IIS(或相关的应用程序池)关机或重启后发生。

在IIS 6.0中运行时,不活动超时可以通过Internet Services Manager中的应用程序池设置进行配置(性能选项卡上的Idle Timeout)。在较早版本的IIS中,可以在machine.config(processModel下的idleTimeout)中进行设置。


2
您知道是否存在一种情况,即进程在不运行Application_End的情况下终止。例如,我已经在Application_Start中映射了一个网络共享,并且我想在Application_End上断开该共享。是否存在应用程序在未触发Application_End的情况下结束的时刻?我想停电会满足此标准。那么某种致命应用程序错误呢? - crush
3
@crush: 是的,无论何时进程以“意外”的方式终止,该事件都不会触发;例如停电/硬件故障,任何线程在进程中“挂起”的情况并且应用程序池终止(例如如果最长请求需要超过30秒才能完成,则进行IIS重置),任何人或任何东西手动对w3wp.exe进程进行“结束进程”操作的情况(例如在任务管理器中),任何“强制关闭”以及任何未经处理的代码导致内存或其他进程级错误的情况(堆栈溢出,GPF等)。 - Tao

0
在我的情况下,应用程序池被回收了,因为属性空闲超时(分钟)

此属性的默认值为20(分钟)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接