Чтобы предотвратить повторное использование AppPool каждые 20 минут, я хотел бы удалить IIS AppPool Idle Timeouts, когда начнется моя Azure Web Role. Мой веб-сайт - это проект веб-приложений.
Как это сделать?
Чтобы предотвратить повторное использование AppPool каждые 20 минут, я хотел бы удалить IIS AppPool Idle Timeouts, когда начнется моя Azure Web Role. Мой веб-сайт - это проект веб-приложений.
Как это сделать?
Создайте задачу запуска, чтобы отключить тайм-аут простоя:
В проекте веб-сайта, на который ссылается ваш проект веб-роли, добавьте файл Startup.cmd
в корневую папку.
В свойствах для Startup.cmd
установите Скопировать в каталог вывода на Копировать, если новый.
Добавьте эту строку в Startup.cmd
:
if exist %windir%\system32\inetsrv\appcmd.exe %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00
Квалификатор if exist %windir%\system32\inetsrv\appcmd.exe
не является обязательным. Он позволяет использовать тот же код на Azure Emulator Express, поэтому вам не нужно устанавливать IIS или запускать Visual Studio в качестве администратора.
Сохраните файл как UTF-8 без подписи. ( Файл > Дополнительные параметры сохранения в Visual Studio.)
В проекте вашей веб-роли в ServiceDefinition.csdef
добавьте это в WebRole
:
<Startup>
<Task commandLine="Startup.cmd" executionContext="elevated" />
</Startup>
Другой вариант - настроить IIS Idle Time-Out Action на "Suspend". Вы можете сделать это как часть запуска своей веб-роли script.
Команда, которая вам нужна, находится в ящике как часть настройки IIS (обратите внимание, что это будет работать с Windows Server 2012 R2 и выше, с вашим кодом, нацеленным на платформу .NET 4.5.1 и выше).
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeoutAction:Suspend
Вам нужно будет обновить конфигурационный файл Azure Cloud Service (.cscfg), чтобы использовать семейство OS 4, как описано scottgu в своем сообщении в блоге.
Так как действия запуска запускаются при инициализации ваших экземпляров и до того, как веб-приложение будет развернуто в IIS, установив по умолчанию пул пула приложений, defacto настроит ваше действие приложения idle time off для приостановки.
В корневом каталоге вашего проекта веб-приложения создайте файл с именем WebRole.cs
со следующим кодом:
public class WebRole : RoleEntryPoint
{
public override void Run()
{
RemoveIISTimeouts();
base.Run();
}
private void RemoveIISTimeouts()
{
Process.Start(
String.Format(@"{0}\system32\inetsrv\appcmd", Environment.GetEnvironmentVariable("windir")),
"set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00");
}
}
Не беспокойтесь. В любом случае у вас действительно должно быть решение для мониторинга вашей веб-роли. И теперь, когда он встроен в панель Azure, проще включить мониторинг, чем правильно настроить тайм-аут простоя (особенно если вы хотите сохранить минимальную привилегию).
В дополнение к ответу @Edward Brey, если вы хотите изменить другие общие настройки в этом запуске script, вот как вы это делаете
rem Preload
%windir%\system32\inetsrv\appcmd list app /xml | %windir%\system32\inetsrv\appcmd set site /in -applicationDefaults.preloadEnabled:True
rem Disable idle
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00
rem Auto start
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.autoStart:true
rem Always running
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning
rem Disable recycling
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00
Чтобы просмотреть список доступных параметров в разделе, выполните
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -?
Это подход, который я использовал:
using (ServerManager iisManager = new ServerManager())
{
Application app = iisManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications[0];
TimeSpan ts = new TimeSpan(0, 00, 00);
iisManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = ts;
iisManager.CommitChanges();
}
Требуется:
using Microsoft.Web.Administration;
using Microsoft.WindowsAzure.ServiceRuntime;