【问题标题】:How many instances of a web application are running in one worker process?一个工作进程中运行了多少个 Web 应用程序实例?
【发布时间】:2013-07-25 12:27:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    HashTable in HttpContext.Current.Cache

    如果您愿意,您可以尝试使用 WinDbg 并转储您的进程中发生的事情,但这是一种非常严厉的策略,可能不会像查看代码那样清楚地说明问题。直到你仔细观察它,并且仍然被 IMO 难住。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      相关资源
      最近更新 更多