Отключите тайм-ауты IIS в веб-роли Azure
Чтобы предотвратить повторное использование AppPool каждые 20 минут, я хотел бы удалить IIS AppPool Idle Timeout при запуске моей веб-роли Azure. Мой сайт - это проект веб-приложения.
Как мне это сделать?
6 ответов
Создайте задачу запуска, чтобы отключить время простоя:
В проекте веб-сайта, на который ссылается ваш веб-проект, добавьте файл
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 на "Приостановить". Вы можете сделать это как часть сценария запуска вашей веб-роли.
Необходимая команда находится в поле как часть установки IIS (обратите внимание, что она будет работать с Windows Server 2012 R2 и более поздними версиями, с вашим кодом, ориентированным на платформу.NET 4.5.1 и выше).
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeoutAction:Suspend
Вам придется обновить файл конфигурации облачной службы Azure (.cscfg), чтобы использовать ОС семейства 4, как указано scottgu в своем блоге.
Поскольку действия при запуске выполняются, когда ваши экземпляры подготовлены и перед развертыванием веб-приложения в IIS, установка значений по умолчанию для пула приложений по умолчанию приведет к тому, что для действия времени ожидания приложения в пуле приложения будет значение Приостановить.
В корне вашего проекта веб-приложения создайте файл с именем 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, если вы хотите изменить другие общие настройки в этом сценарии запуска, вот как вы это делаете
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;