Azure中的水平缩放方面的术语尚不清楚。
当它创建一个应用程序的多个实例时,我知道它们在单独的VM中运行,因此,当发生这种水平扩展时,这应该会导致创建带有自己的静态变量集的全新AppDomain。
如果是这种情况,那么每个实例都将调用Application_Start事件吗?
我们具有“缓存刷新”功能,该功能涉及设置侦听器以订阅消息队列中的“主题”,以便在接收到消息时刷新静态缓存。我们曾经认为我们必须在HttpApplication.Init事件中设置侦听器,该事件将为每个实例调用,但在意识到AppDomain中的所有HttpApplication实例共享同一组静态变量后,这不再有意义。
我的新理解是,即使没有水平扩展,Web应用程序中也会出现多个HttpApplication实例(因此会多次调用HttpApplication.Init)。换句话说,这是asp.net Web应用程序如何即使在单个AppDomain中也处理请求的正常功能。 Azure的水平扩展完全不同,涉及实例化完全独立的AppDomain。听起来不错吗?
答案 0 :(得分:0)
根据您的描述,首先,我们需要了解以下两点:
Application_Start
仅在创建第一个HttpApplication
对象并且随后创建的HttpApplication
个实例不会触发此事件之后调用。
每个HttpApplication
实例将创建一组新的HttpModule
,并在创建后调用Init方法。
我们可以检查原始代码以了解如何创建HttpApplication
:
我们可以在System.Web.HttpApplicationFactory.GetNormalApplicationInstance
因此,在单个AppDomain中,如果在进行并发访问时没有足够的HttpApplication
实例,则将创建新的HttpApplication
实例,并在创建每个实例后调用HttpApplication.Init
。但是Application_Start
仅在创建第一个HttpApplication
实例之后被调用一次。
根据以上描述,我认为您应该在Application_Start
事件中设置侦听器。当发生水平缩放时,每次创建新的AppDomain后都会调用Application_Start
。