У нас есть приложение 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 );
}