有关IHttpModule.Dispose和Application_End的问题

时间:2011-07-14 19:20:32

标签: c# asp.net iis iis-7

我刚刚阅读了这篇文章"When is IHttpModule.Dispose method called?"我发现了这个

  

“Dispose方法在删除之前执行任何最终清理工作   来自执行管道的模块。“

     

这意味着它在应用程序范围内。

     

没关系。无论如何我自己尝试,我发现使用   IHttpModule Dispose方法和事件处理程序   Application.Disposed事件应该几乎不一样。第一次发生   在第二个之后。

我觉得这不是100%正确,即IHttpModule.Dispose并不总是跟在Application_End之后。假设我为我的应用程序运行了多个Application对象实例,这意味着Application对象的每个实例都将包含其中的单个模块实例。现在让我们假设应用程序池充满应用程序实例时会到来,那么会发生什么?不会一个接一个地开始处理应用程序实例,而是在链中应用实例中的模块。现在这个模块的处理并不意味着Application_End将在此之后启动。应用程序仍在运行。我对吗?

2 个答案:

答案 0 :(得分:9)

HttpModules是每个HttpApplication。与其名称建议相反,global.asax中的Application_End方法不会在每个HttpApplicaton生命周期结束时触发。它在当前AppDomain中的所有HttpApplications的生命周期结束时被解雇(当AppDomain被拆除时)。 Application_Start方法也是如此。

答案 1 :(得分:0)

每个应用程序只有1个应用程序对象实例。有许多会话对象,每个会话对象处理请求,或等待回收。

应用程序池不会充满应用程序对象,因为每个应用程序只有1个。当一个应用程序池托管超过1个应用程序时,那么会有很多并且回收池会杀死它们。应用程序池还对它们进行运行状况监视,这将在一定量的请求/内存使用后重新启动进程。在这种情况下,现有会话将在新应用程序启动以处理新请求时死亡。当旧应用程序中的所有会话都已消失时,应用程序将被拆除。

有关详细信息,请参阅MSDN