【发布时间】:2017-11-09 10:14:47
【问题描述】:
[我发布这篇文章是为了记录我经过数小时痛苦的试错后实际发现的内容。]
我有一个网站需要“始终运行”(因为在这种情况下,它有一个 Hangfire 作业,负责每 5 分钟启动一次计划任务),并且 默认情况下,网站仅在收到第一个请求时启动。
那么,如何确保网站自动启动?还有,如何通过 TFS 发布管理工具进行配置?
【问题讨论】:
[我发布这篇文章是为了记录我经过数小时痛苦的试错后实际发现的内容。]
我有一个网站需要“始终运行”(因为在这种情况下,它有一个 Hangfire 作业,负责每 5 分钟启动一次计划任务),并且 默认情况下,网站仅在收到第一个请求时启动。
那么,如何确保网站自动启动?还有,如何通过 TFS 发布管理工具进行配置?
【问题讨论】:
[此答案并非特定于 Hangfire,但请参阅 Hangfire documentation's discussion of this issue 了解它如何影响 Hangfire 的详细信息,但请注意,推荐的解决方法有些复杂,并且比下面的解决方案复杂得多.另请参阅一个单独且相当的comprehensive discussion on the Hangfire support forum,它提供了几种替代解决方案。]
在 IIS 中,每个网站都与一个应用程序池(App Pool)相关联。您可以将应用程序池配置为通过 IIS 管理器自动启动,方法是将应用程序池的“高级设置”中的“启动模式”更改为 AlwaysRunning:
但是,启动应用程序池并不会启动与其关联的网站。在收到第一个请求之前,网站不会加载。
在 IIS8(或带有扩展名的 IIS7.5)中,添加了一个new setting,允许我们解决这个问题。您可以通过在网站的“高级设置”中将“启用预加载”设置为True 来确保网站在应用程序池启动后立即收到请求:
这些设置的组合保证了网站会在IIS启动时自动启动,在App Pool被回收后立即启动等。
但是,如何让这些设置自动应用作为 TFS 发布管道的一部分,而不必记住手动设置?
在您的发布定义中,您大概有一个“IIS Web 应用程序管理”任务,它设置应用程序池和网站。在此步骤的配置面板中,应该有一个“高级”框,其中包含“附加 AppCmd.exe 命令”输入字段。您可以使用 AppCmd 应用上述设置。
AppCmd 具有我在代码高尔夫比赛之外见过的最令人困惑的命令行语法,但下面是对我有用的咒语:
set config /section:applicationPools -[name='myAppPoolName'].startMode:AlwaysRunning
set app "mySiteName/" /preloadEnabled:true
请注意,如果您为您的应用程序池名称和网站名称定义了配置变量,那么您可以使用它们而不是硬编码名称,例如:
set config /section:applicationPools -[name='$(appPoolName)'].startMode:AlwaysRunning
我希望这对某人有所帮助...感谢收听 :-)