Можете ли вы предотвратить закрытие приложения ASP.NET? - PullRequest
17 голосов
/ 20 августа 2009

Мне кажется, что я слышал, что приложения ASP.NET через некоторое время отключаются из-за простоя (т. Е. Нет посетителей).

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

Заранее спасибо!

Ответы [ 4 ]

27 голосов
/ 20 августа 2009

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

  1. Если у вас есть контроль над IIS, вы можете изменить «Время ожидания простоя» в пуле приложений, по умолчанию оно составляет 20 минут.
  2. Если вы НЕ контролируете IIS (общий или другой хостинг), вы можете использовать внешний сервис для проверки связи с сайтом. MyWebKeepAlive или Pingdom - хорошие варианты для этого.

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

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

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

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

18 голосов
/ 28 февраля 2012

Помимо внешней поддержки, вы можете сделать внутреннюю поддержку внутри 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;
            }
        }
    }
7 голосов
/ 20 августа 2009

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

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

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

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

0 голосов
/ 20 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...