Ho un numero di attività di avvio in file batch. In particolare, chiamo IIS appcmd.exe
per configurare IIS. Le attività di avvio in Azure dovrebbero idivotent (cioè essere in grado di essere eseguite ripetutamente con gli stessi risultati), nel caso in cui il ruolo venga riavviato per qualche motivo. Sfortunatamente molti dei miei comandi di configurazione IIS falliranno la seconda volta, ad esempio perché eliminano un nodo di configurazione la prima volta che non è presente nelle esecuzioni successive.Come rendere identienti le attività di avvio?
La mia domanda è, come posso rendere queste attività di avvio idempotenti? C'è un modo per rendere appcmd.exe non generare errori? C'è un modo per far sì che la shell catturi gli errori? C'è un modo per far sì che il framework di Azure ignori gli errori?
Ecco un esempio delle mie attività di avvio. Tutto ciò è contenuto in un file di 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']
Abbastanza sicuro che le linee che dovrebbero impedire l'avvio automatico di AppPools inutilizzati non funzioneranno. Invece di utilizzare "Classic .NET AppPool" ecc. Come nome da utilizzare, Clr2ClassicAppPool, ecc. –
In realtà quei nomi funzionano bene, ma ha bisogno di essere citati in modo leggermente diverso. Ho aggiornato il codice sopra, nel caso in cui qualcuno lo guardi più tardi. –