PreApplicationStartMethod 何时真正被触发运行?
Posted
技术标签:
【中文标题】PreApplicationStartMethod 何时真正被触发运行?【英文标题】:When does PreApplicationStartMethod actually get triggered to run? 【发布时间】:2011-08-22 18:55:24 【问题描述】:当使用 WebActivator PreApplicationStart 方法时,究竟是什么触发了绑定到 this 的方法运行? IIS7 何时启动 App Pool?何时向网络服务器发出第一个请求?还有什么?如果您有答案,能否请您提供一个参考,说明您从何处获得此信息?
在 IIS 7.5 中是否有任何这些变化?
【问题讨论】:
【参考方案1】:WebActivator PreApplicationStart
实际上依赖于 ASP.NET PreApplicationStartMethodAttribute(请参阅this 链接以了解网络激活器的工作原理)。
PreApplicationStartMethodAttribute
在ASP.NET runtime starts up 应用程序和代码在管道中早期运行时有效,甚至在 app_start 事件被触发之前。因此,要回答您的问题,当第一次向 Web 服务器发出请求时会发生触发(这反过来会启动应用程序)。
请注意,触发器与 ASP.NET 应用程序启动有关,与应用程序池无关。您的应用程序池可能由于某些其他应用程序(可以是非 ASP.NET 应用程序)而运行,但是当第一次请求 ASP.NET 应用程序时,由于应用程序启动,此触发器将发生(对于特定应用程序)。
如果您正在使用auto-start 功能,那么 IIS 将在您的应用程序池回收时重新启动您的应用程序,因此PreApplicationStart
将被触发。
【讨论】:
ScottGu 提供的文章很棒。我很想知道你对这个IProcessHostPreloadClient
界面的看法。由于您似乎可以在应用程序收到第一个请求之前拥有自己的缓存逻辑,您认为与在收到请求之前使用PreApplicationStartMethod
运行代码相比,这是一个不错的选择吗?
@Eli,IProcessHostPreloadClient的确切目的是为应用程序添加预热逻辑(传统上在app_start事件或PreApplicationStartMethod中运行的代码。唯一的问题是它需要IIS 7.5并且仍然存在很少有基于 Win 2003/2008 的 prod 环境和 XP 上的 dev 环境。
@VinayC,自动启动功能不会触发Application_Start,你确定它会触发PreApplicationStart事件吗?
@TormodHystadm,你是对的!自动启动功能将启动应用程序池并调用配置的启动代码,但不会触发实际的 ASP.NET 应用程序(负责PreApplicationStart
)。您必须在自动启动代码中移动您的启动代码,或者在自动启动代码中向您的应用发出 HTTP 请求。
在 Azure WebActivator.PreApplicationStartMethod
start 方法触发多次。可能是什么问题?【参考方案2】:
对@VinayC 的回答的一个小补充:如果您在 PreApplicationStartMehod 中添加断点并调试您的 Web 应用程序,您可能会看到它在每个请求上都被调用。通过在 PreApplicationStartMethod 中写入日志文件,我很容易确认这不是通常的行为。当未附加到调试器时,此方法不会在每个请求上运行。
【讨论】:
在 AzureWebActivator.PreApplicationStartMethod
start 方法触发多次。可能是什么问题?
@ManirajSS 您可以拥有多个应用程序实例。 ***.com/a/6957462/242520以上是关于PreApplicationStartMethod 何时真正被触发运行?的主要内容,如果未能解决你的问题,请参考以下文章