我在批處理文件中有許多啓動任務。特別是我調用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