我在批处理文件中有许多启动任务。特别是我调用IIS的appcmd.exe
来配置IIS。 Azure中的启动任务应该是幂等的(即,能够以相同的结果重复运行),以防由于某种原因重新启动角色。不幸的是,我的许多IIS配置命令第二次都会失败,例如,因为他们第一次删除了一个配置节点,而后来这些配置节点没有出现在后续运行中。如何使启动任务具有幂等性?
我的问题是,我如何使这些启动任务idempotent?有没有办法让appcmd.exe不会抛出错误?有没有办法让shell捕获错误?有没有办法让Azure框架忽略错误?
下面是我的启动任务的示例。这全部包含在命令文件configiis.cmd
中。
@REM Enable IIS compression for application/json MIME type
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost
@REM Set IIS to automatically start AppPools
%windir%\system32\inetsrv\appcmd.exe set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning /commit:apphost
@REM Set IIS to not shut down idle AppPools
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 /commit:apphost
@REM But don't automatically start the AppPools that we don't use, and do shut them down when idle
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='Classic .NET AppPool'].startMode:OnDemand" "/[name='Classic .NET AppPool'].autoStart:False" "/[name='Classic .NET AppPool'].processModel.idleTimeout:00:01:00" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0'].startMode:OnDemand" "/[name='ASP.NET v4.0'].autoStart:False" "/[name='ASP.NET v4.0'].processModel.idleTimeout:00:01:00" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0 Classic'].startMode:OnDemand" "/[name='ASP.NET v4.0 Classic'].autoStart:False" "/[name='ASP.NET v4.0 Classic'].processModel.idleTimeout:00:01:00" /commit:apphost
@REM remove IIS response headers
%windir%\system32\inetsrv\appcmd.exe set config /section:httpProtocol /-customHeaders.[name='X-Powered-By']
很确定应该阻止未使用的AppPools自动启动的行不起作用。而不是使用'Classic .NET AppPool'等作为您需要使用Clr2ClassicAppPool等的名称。 – 2012-10-16 23:56:25
其实这些名字都能正常工作,但确实需要引用一点不同。我更新了上面的代码,以防有人在以后看到它。 – 2012-10-26 18:07:48