Обнаружение перезагрузки приложения ASP.NET - PullRequest
10 голосов
/ 01 сентября 2011

Я пытаюсь определить, когда приложение ASP.NET перерабатывается из-за изменения файла web.config или перезапуска пула приложений IIS вручную.

Изначально я думал, что метод Application_End в ASP.NET будет работать, и попробовал следующее:

protected void Application_End(object sender, EventArgs e)
{
    File.AppendAllText("log.txt", DateTime.Now + "\n");
}

Файл был создан при первом изменении файла web.config, но последующие изменения не сделалине уволить событие.Точно так же при тестировании в IIS первая ручная утилита пула приложений создала файл, но более поздние - нет, как будто событие Application_End срабатывает только один раз.

Как бы я обнаруживал каждый раз, когда пул / приложениеперерабатывает

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Следующее может быть немного взломать, но вы можете использовать приложение Cache, чтобы понять это.Каждый раз, когда страница загружается, вы можете проверять кеш на наличие определенного ключа, если ключ не существует, вы можете считать его «переработанным», а затем добавить ключ.Не самый лучший метод, но может работать только для того, что вам нужно.

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

if (HttpContext.Current.Cache["RecycleCheck"] != null)
{ 
    // Add flag to cache
    HttpContext.Current.Cache.Insert("RecycleCheck", "1", null,
        DateTime.UtcNow.AddDays(2),  // 2 days (most will recycle by then)
        System.Web.Caching.Cache.NoSlidingExpiration);

    // Do what you need because a recycle has happened
}

Этот метод не поднимет его, когда произойдет переработка.Он идентифицирует перезапуск только по первому запросу после перезапуска.

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

2 голосов
/ 01 ноября 2013

Хороший ответ на этот вопрос был дан в следующем вопросе о переполнении стека: как определить, заканчивается ли текущий пул приложений

Для отслеживания перезапуска пула приложений необходимо реализоватьинтерфейс IRegisteredObject, вызовите ApplicationManager.CreateObject, чтобы создать экземпляр вашего объекта, а затем зарегистрировать его в HostingEnvironment.RegisterObject во время запуска приложения.

Когда реализация IRegisteredObject.Stop (bool) этого объекта вызывается с false какпараметр, это уведомление о том, что домен приложения закрывается и объект должен быть незарегистрирован (вроде как глобальное удаление) с вызовом HostingEnvironment.UnregisterObject.

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

0 голосов
/ 05 сентября 2011

Почему бы тебе не сделать что-то подобное?Отрегулируйте частоту задания таймера, чтобы повысить точность определения момента повторного использования appPool.

private readonly Timer timer = new Timer();
private DateTime start;
private string logFile;

void Application_Start(object sender, EventArgs e)
{
  start= DateTime.Now;
  logFile = Server.MapPath(
            string.Concat("Log-",start.ToString("yyyyMMdd-HHmmss.fff"),".txt"));

  timer.Interval = 1000;
  timer.Elapsed += (s, ee) 
            => File.WriteAllText(logFile,
            string.Concat("App Start :", start, " Last Alive: ", DateTime.Now));

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