Как заставить пул приложений 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 );
}

3 ответов


на основе Вашего сообщения кажется, что вы knwo, когда вы хотите запустить перезапуск, так что вот в должности это скажет вам, как.


более жестокий подход, чтобы вызвать процесс.GetCurrentProcess().Убивать() Не очень изящно, но если ваш сайт имеет свой собственный пул приложений, и вам все равно, какие текущие запросы жестоко останавливаются, это довольно эффективно!


упрощенная версия VB кода, который вы совместно использовали. Эта версия использует цикл For вместо запроса LINQ. Кроме того, для использования Microsoft.Сеть.Администрирование, необходимо импортировать DLL из c:\windows\system32\inetsrv

Imports System.Diagnostics
Imports Microsoft.Web.Administration

Dim pid As Integer = Process.GetCurrentProcess().Id
Dim manager = New ServerManager()
For Each p As WorkerProcess In manager.WorkerProcesses
    If p.ProcessId = pid Then
         For Each a As ApplicationPool In manager.ApplicationPools
             If a.Name = p.AppPoolName Then
                 a.Recycle()
                 Exit For
             End If
         Next
         Exit For
    End If
Next