在一个工作进程中运行了多少个Web应用程序实例?

时间:2013-07-25 14:30:59

标签: asp.net iis appdomain static-members worker-process

我在IIS 8上有一个单独的ASP.NET MVC 4 Web应用程序(扩展System.Web.HttpApplication的MvcApplication)。我的应用程序在集成管道模式下在单独的应用程序池上运行。此应用程序池的最大工作进程数设置为1.

据我所知,应用程序实例可能会被池化,并且可能存在多个并行线程,这将为我的应用程序(AppDomain)的同一实例调用Begin_Request / End_Request。另外我理解,如果我将“最大工作进程数”设置为大于1,那么肯定会有多个应用程序实例(AppDomain)。

我不明白的是,将发出多少次对Application_Start的调用,以及我的静态变量的实例(存储在MvcApplication中,还有一些单例,如NHibernate会话工厂等)将在给定时刻存在

目前我在清理.NET MemoryCache方面遇到了一些问题。我网站的一些用户正在从缓存中接收旧值,这使我认为可能存在多个全局MemoryCache实例,即使我将“最大工作进程数”设置为1。

在单个工作进程中并行运行的应用程序静态变量和单例的最大实例数是多少?

是否有任何实用程序或脚本可以帮助我枚举IIS上的所有AppDomain?

1 个答案:

答案 0 :(得分:1)

我不确定这是否适用于您,但HttpModule Initialize方法被多次调用,因为即使只有一个Application实例。一个HttpApplication可以生成多个HttpModule实例,因此请确保这些初始化是线程安全的。

Application_Start_End每个网站只会启动一次并停止使用您当前的设置,这样就不会出现问题。如果您使用的是HttpContext.Cache对象,则可能会遇到此答案中提到的问题:

HashTable in HttpContext.Current.Cache

如果你愿意,你可以尝试使用WinDbg并获取你的过程中正在发生的事情的转储,但这是一个非常严厉的策略,可能不会像查看代码那样轻松。直到你看得更难一点,并且仍然难倒IMO。