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

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

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

6 ответов


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

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

  2. в свойства Startup.cmd, set копировать в выходной каталог to копировать, если новее.

  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 Express, поэтому вам не нужно устанавливать IIS или запускать Visual Studio от имени администратора.

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

  5. в вашем проекте веб-роли, в ServiceDefinition.csdef добавьте к этому WebRole:

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="elevated" />
    </Startup>
    

другой вариант-настроить действие ожидания простоя IIS для "приостановки". Вы можете сделать это как часть сценария запуска веб-роли.

команда, которая вам нужна, находится в поле как часть установки IIS (обратите внимание, что это будет работать с Windows Server 2012 R2 и выше, с вашим кодом, нацеленным на .NET 4.5.1 framework и выше).

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeoutAction:Suspend

вам придется обновить файл конфигурации облачной службы Azure (.cscfg) использовать семейство ОС 4, как указано scottgu в его блог пост.

поскольку действия запуска выполняются при подготовке экземпляров и до развертывания веб-приложения в IIS, установив значения по умолчанию пула приложений, defacto установит действие тайм-аута apppool idel приложения для приостановки.


в корне проекта веб-приложения создайте файл с именем 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;