Подтвердить что ты не робот

Отключить тайм-ауты ожидания IIS в роли Azure Web

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

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

4b9b3361

Ответ 1

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

  • В проекте веб-сайта, на который ссылается ваш проект веб-роли, добавьте файл 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>
    

Ответ 2

Другой вариант - настроить 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 для приостановки.

Ответ 3

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

Ответ 4

Не беспокойтесь. В любом случае у вас действительно должно быть решение для мониторинга вашей веб-роли. И теперь, когда он встроен в панель Azure, проще включить мониторинг, чем правильно настроить тайм-аут простоя (особенно если вы хотите сохранить минимальную привилегию).

Ответ 5

В дополнение к ответу @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 -?

Ответ 6

Это подход, который я использовал:

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;