0

我有一个托管在 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?

4

1 回答 1

1

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

Application_Start并且_End每个站点仅使用您当前的设置启动和停止一次,因此这不是问题。如果您使用的是 HttpContext.Cache 对象,您可能会遇到此答案中提到的问题:

HttpContext.Current.Cache 中的哈希表

如果您愿意,您可以尝试使用 WinDbg 并获取进程中发生的情况的转储,但这是一种非常严厉的策略,可能不会像查看代码那样清楚。直到你更努力地看它,并且仍然难倒 IMO。

于 2013-07-25T16:09:17.553 回答