Tengo una serie de tareas de inicio en archivos por lotes. En particular, llamo al appcmd.exe
de IIS para configurar IIS. Se supone que las tareas de inicio en Azure son idempotentes (es decir, pueden ejecutarse repetidamente con los mismos resultados), en caso de que la función se reinicie por algún motivo. Desafortunadamente, muchos de mis comandos de configuración de IIS fallarán la segunda vez, por ejemplo, porque eliminan un nodo de configuración la primera vez, que luego no está presente en las ejecuciones posteriores.¿Cómo hacer las tareas de inicio idempotentes?
Mi pregunta es, ¿cómo puedo idempotent estas tareas de inicio? ¿Hay alguna forma de que appcmd.exe no genere errores? ¿Hay alguna manera de hacer que el proyectil capte los errores? ¿Hay alguna manera de hacer que el marco de Azure ignore los errores?
Aquí hay un ejemplo de mis tareas de inicio. Todo esto está contenido en un archivo de comando, 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']
Bastante seguro de que las líneas que se supone que detienen el inicio automático de los AppPools no funcionarán. En lugar de usar 'Classic .NET AppPool', etc. como el nombre que necesita para usar Clr2ClassicAppPool, etc. –
En realidad, esos nombres funcionan bien, pero es necesario citarlos de forma un poco diferente. Actualicé el código anterior, por si alguien lo mira más tarde. –