Можете ли вы предотвратить закрытие приложения ASP.NET?

Я думаю, я слышал, что приложения ASP.NET будут закрыты через некоторое время бездействия (т.е. нет посетителей).

Есть ли способ предотвратить такое поведение? У меня есть таймер, который запускает какой-то код из события global.asax.cs application_start и хочет убедиться, что он продолжает работать, даже когда посетители не попадают на сайт.

Спасибо заранее!

Ответы

Ответ 1

Вы можете сделать это несколькими способами.

  • Если у вас есть контроль над IIS, вы можете изменить "Idle Timeout" в пуле приложений, по умолчанию это 20 минут.
  • Если у вас нет контроля над IIS (общий или другой хостинг), вы можете использовать внешнюю службу для ping-сайта. MyWebKeepAlive или Pingdom - хорошие варианты для этого.

Если вы находитесь под второй опцией, я настоятельно рекомендую внешний источник, поскольку он меньше управляется, и если у вас нет IIS, доступного для настройки, у вас, скорее всего, нет сервера для добавления пинга приложение к.

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

Последняя мысль

Если вы переходите на путь изменения тайм-аута Idys Idle, я рекомендую установить регулярную переработку пула приложений. Поскольку многие веб-приложения извлекают выгоду из периодической переработки, и чаще всего тайм-аут простоя является самым большим регулярным коэффициентом рециркуляции.

Ответ 2

Помимо внешнего сохранения, вы можете сделать внутреннее сохранение внутри global.asax:

    static Thread keepAliveThread = new Thread(KeepAlive);

    protected void Application_Start()
    {
        keepAliveThread.Start();
    }

    protected void Application_End()
    {
        keepAliveThread.Abort();
    }

    static void KeepAlive()
    {
        while (true)
        {
            WebRequest req = WebRequest.Create("http://www.mywebsite.com/DummyPage.aspx");
            req.GetResponse();
            try
            {
                Thread.Sleep(60000);
            }
            catch (ThreadAbortException)
            {
                break;
            }
        }
    }

Ответ 3

В IIS 6 перейдите в раздел "Пулы приложений" и щелкните правой кнопкой мыши > Свойства в пуле, на котором размещено приложение ASP.NET. Перейдите на вкладку "Производительность" и снимите флажок "Отключить рабочие процессы после простоя для:"

В IIS 7 перейдите в панель "Соединения" и найдите "Пулы приложений" и выберите "Дополнительные настройки" для пула, на котором размещается ваше приложение. Найдите свойство "Idle Timeout" и установите значение "0" (это отключает его).

Значение по умолчанию - 20 минут бездействия. Если снять флажок, как только ваш AppDomain будет загружен рабочим процессом, он никогда не умрет (если вы не убьете этот процесс или что-то в этом роде). По умолчанию IIS будет перерабатывать процесс, когда он достигнет определенного предела, например, колпачок памяти, но он также запустит новый и "перейдет в фазу" всех входящих запросов до тех пор, пока старый не будет использоваться, чтобы свести к минимуму сбой.

Если у вас нет прямого контроля над конфигурацией IIS (например, с общим хостом), лучше всего иметь небольшое приложение, работающее в отдельной системе - например, постоянная рабочая станция - которая попадает на ваш сайт каждые x минут, чтобы сохранить пул приложений от тайм-аута. Ничего особенного - простой цикл WebRequest и while() в консольном приложении.

Ответ 4

Перейдите в свой диспетчер задач и запустите w3wp.exe(или aspnet_wp). Ничто не может помешать вам сделать это. В нижней части приложения ASP.NET не могут принимать непрерывные функции.

Тем не менее, вы можете запустить отдельный поток, который не будет подвергаться тайм-ауту в режиме ожидания - пока это что-то нужно делать. Я использовал этот метод для управления 45-минутным импортом, который будет продолжаться независимо от того, был ли кто-либо на веб-сайте. Я использовал журнал транзакций и Application_Start, так что, когда процесс был переработан, он мог бы забрать, где он остановился.