【问题标题】:Azure Appcmd startup task, setting preloadEnabled for ALL sitesAzure Appcmd 启动任务,为所有站点设置 preloadEnabled
【发布时间】:2013-04-11 17:55:36
【问题描述】:

好的,所以我基本上正在使用新的 IIS 8.0 应用程序初始化模块实现天蓝色预热。

我有一个启动任务(cmd 文件),它基本上已经取消了 IIS 中的空闲超时和回收时间。我正在尝试向其中添加应用程序初始化。

我意识到我需要设置两件事; startModepreloadEnabled

我的应用程序在 IIS 中有许多站点(大约 10 个),所有站点都由 Azure 随机命名,并带有自己随机命名的应用程序池。

startMode 很简单,因为可以通过以下方式将其设置为应用程序池默认值:

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning

这会将其应用于所有应用程序池。

但是preloadEnabled 就不是那么容易了。

要设置preloadEnabled,您可以将其用于命名站点:

%windir%\system32\inetsrv\appcmd set config -section:sites [name='MySite'].applicationDefaults.preloadEnabled

但我需要将它应用于我不知道名称(它们是随机的)的所有网站,这是一种默认值(我如何设置startMode)。

有什么想法吗?

【问题讨论】:

  • 你试过那个吗:appcmd.exe set config -section:system.applicationHost/sites /applicationDefaults.preloadEnabled:"True" /commit:apphost
  • @astaykov preloadEnabled 不是站点默认设置的选项,只能按站点设置(我试过了,它说这样的设置不存在
  • 在您的架构中,您是动态添加站点,还是在构建云服务包时固定站点,在部署时不进行任何更改(即不添加或删除新站点)?

标签: azure iis-8 appcmd


【解决方案1】:

找了一天,终于找到了。它基本上使用 appcmd 中的循环,通过使用管道将命令链接在一起(有点像for 循环)。这里是:

%systemroot%\system32\inetsrv\AppCmd.exe list app /xml | %windir%\system32\inetsrv\appcmd set site /in -applicationDefaults.preloadEnabled:True

【讨论】:

  • 当我使用它时,我得到: Publish-AzureServiceProject : BadRequest :您的角色实例在更新或升级操作期间已回收多次。这表示您的服务的新版本或您在配置服务时提供的配置设置会阻止角色实例运行。验证您的代码不会引发未处理的异常并且您的配置设置正确,然后开始另一个更新或升级操作。
【解决方案2】:

对于仍在使用 IIS 7.5 的用户:

【讨论】:

    【解决方案3】:

    对于IIS 8.5,使用appcmd 在应用程序级别(而不是站点级别)设置preload,应使用以下命令。

    appcmd set app "Default Web Site/ApplicationName" /preloadenabled:true
    

    【讨论】:

      【解决方案4】:

      在 windows Server 2012 R2 和 IIS 8.5 中进入 CMD Adminitrator。

      cd C:\Windows\System32\inetsrv && appcmd list app /xml | appcmd 设置站点 /in -applicationDefaults.preloadEnabled:True /commit:apphost

      【讨论】: