如何配置网站以使用 TFS 发布管理自动启动?

How can I configure a website to start automatically using TFS release management?

[我发布这篇文章是为了记录我经过数小时痛苦的反复试验后实际发现的内容。]

我有一个网站需要 "always running"(因为在这种情况下它有一个 Hangfire 作业负责每 5 分钟启动一次计划任务),默认情况下,网站仅在收到第一个请求时启动

那么,如何保证网站自动启动?而且,我如何通过 TFS 发布管理工具配置它?

[此答案并非特定于 Hangfire,但请参阅 Hangfire documentation's discussion of this issue for details of how it affects Hangfire, but note that the recommended work-around is somewhat involved, and much more complex than the solution below. See also a separate and quite comprehensive discussion on the Hangfire support forum,其中提供了几种替代解决方案。]

在IIS中,每个网站都关联一个应用程序池(App Pool)。您可以将应用程序池配置为通过 IIS 管理器自动启动,方法是将应用程序池的 "Advanced Settings" 中的 "Start Mode" 更改为 AlwaysRunning

但是,启动应用程序池不会启动与之关联的网站。在收到第一个请求之前,网站不会加载。

在 IIS8(或带扩展的 IIS7.5)中,添加了一个 new setting 允许我们解决这个问题。您可以通过将网站 "Advanced Settings" 中的 "Preload Enabled" 设置为 True 来确保网站在应用程序池启动后立即收到请求:

这些设置的组合确保网站在IIS启动时自动启动,并在App Pool被回收后立即自动启动等

但是,如何让这些设置自动应用 作为 TFS 发布管道的一部分,而不是必须记住手动设置它们?

在您的发布定义中,您可能有一个 "IIS Web App Management" 任务,它设置应用程序池和网站。在此步骤的配置面板中,应该有一个带有 "Additional AppCmd.exe Commands" 输入字段的 "Advanced" 框。您可以使用 AppCmd 应用上述设置。

AppCmd 具有我在代码高尔夫比赛之外见过的最令人困惑的命令行语法,但这是对我有用的咒语:

set config /section:applicationPools -[name='myAppPoolName'].startMode:AlwaysRunning

set app "mySiteName/" /preloadEnabled:true

请注意,如果您为应用程序池名称和网站名称定义了配置变量,那么您可以使用这些变量而不是对名称进行硬编码,例如:

set config /section:applicationPools -[name='$(appPoolName)'].startMode:AlwaysRunning

我希望这对某人有所帮助...感谢收听:-)