Как вы заставляете пул приложений IIS перезапускаться всякий раз, когда перезагружается домен приложения?

У нас есть приложение ASP.NET MVC 4, которое ссылается на устаревший собственный код. Проблема в том, что этот унаследованный код имеет глобальную статистику, которая создается при запуске, но поскольку нативный код ничего не знает о доменах приложений, этот код не -повторно инициализируется при перезагрузке домена приложения. Это вызывает неправильное поведение или сбои в нашем приложении, пока процесс пула приложений не будет перезапущен.

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

Немного информации о моей настройке,

  1. Приложение ASP.NET MVC 4
  2. IIS 7.5, но при необходимости я могу перейти на 8
  3. Я могу гарантировать, что в каждом пуле приложений будет одно приложение, поэтому я не буду влиять на другие приложения.

Обновление

Основываясь на приведенном ниже ответе, я подключился к событию выгрузки AppDomain и использовал код, аналогичный следующему, для повторного использования пула приложений.

try
{
   // Find the worker process running us and from that our AppPool
   int pid = Process.GetCurrentProcess().Id;
   var manager = new ServerManager();
   WorkerProcess process = (from p in manager.WorkerProcesses where p.ProcessId == pid select p).FirstOrDefault();

   // From the name, find the AppPool and recycle it
   if ( process != null )
   {
      ApplicationPool pool = (from p in manager.ApplicationPools where p.Name == process.AppPoolName select p).FirstOrDefault();
      if ( pool != null )
      {
         log.Info( "Recycling Application Pool " + pool.Name );
         pool.Recycle();
      }
   }
}
catch ( NotImplementedException nie )
{
   log.InfoException( "Server Management functions are not implemented. We are likely running under IIS Express. Shutting down server.", nie );
   Environment.Exit( 0 );
}
10
задан Rob Prouse 10 August 2012 в 14:40
поделиться