Отключите тайм-ауты IIS в веб-роли Azure

Чтобы предотвратить повторное использование AppPool каждые 20 минут, я хотел бы удалить IIS AppPool Idle Timeout при запуске моей веб-роли Azure. Мой сайт - это проект веб-приложения.

Как мне это сделать?

6 ответов

Решение

Создайте задачу запуска, чтобы отключить время простоя:

  1. В проекте веб-сайта, на который ссылается ваш веб-проект, добавьте файл Startup.cmd в корневую папку.

  2. В свойствах для Startup.cmdустановите Копировать в выходной каталог на Копировать, если новее.

  3. Добавить эту строку в 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 от имени администратора.

  4. Сохраните файл как UTF-8 без подписи. (Файл> Дополнительные параметры сохранения в Visual Studio.)

  5. В вашем проекте веб-роли, в 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;
Другие вопросы по тегам