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

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

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

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

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

Обновление

В соответствии с приведенным ниже ответом я подключился к событию разгрузки 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 );
}

Ответ 1

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

Ответ 2

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

Ответ 3

Упрощенная версия VB кода, который вы использовали. Эта версия использует цикл For вместо запроса LINQ. Кроме того, чтобы использовать Microsoft.Web.Administration, вы должны импортировать 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