Можете ли вы предотвратить закрытие приложения 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, так что, когда процесс был переработан, он мог бы забрать, где он остановился.