배치 파일에 여러 가지 시작 작업이 있습니다. 특히 IIS를 구성하기 위해 IIS의 appcmd.exe
을 호출합니다. Azure의 스타트 업 작업은 웬일인지 롤이 재시작 될 경우 같은 결과로 반복적으로 실행될 수있는 멱등 원 (isempotent)으로되어 있습니다. 안타깝게도 IIS 구성 명령 중 많은 부분이 두 번째로 실패합니다. 예를 들어 후속 실행시 처음으로 구성 노드를 삭제하기 때문입니다.시작 작업을 멱등환으로 만드는 방법은 무엇입니까?
제 질문은 이러한 시작 작업을 멱등환으로 만드는 방법입니다. appcmd.exe에서 오류를 발생시키지 않는 방법이 있습니까? 셸이 오류를 잡을 수있는 방법이 있습니까? 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 등을 사용해야합니다. –
실제로 그 이름은 잘 작동하지만 약간 따옴표로 묶어야합니다. 위의 코드를 업데이트했습니다. 누군가 나중에 살펴볼 때를 대비하여. –