Ответ 1
На основании вашего сообщения вам будет показано, что вы хотите запустить перезагрузку, так что вот post, который расскажет вам, как это сделать.
У нас есть приложение ASP.NET MVC 4, которое ссылается на старый собственный код. Проблема в том, что этот устаревший код имеет глобальную статику, которая создается при запуске, но поскольку собственный код ничего не знает о доменах приложений, этот код не переинициализируется при перезагрузке домена приложения. Это приводит к некорректному поведению или сбоям в нашем приложении до перезапуска процесса пула приложений.
Из-за этого я хотел бы заставить пул приложений перерабатывать всякий раз, когда наше приложение App Domain перерабатывается. Есть ли в IIS параметр для этого или есть код, который я могу вызвать в своем приложении, когда домен выгружается?
Некоторая информация о моей настройке,
Обновление
В соответствии с приведенным ниже ответом я подключился к событию разгрузки 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 );
}
На основании вашего сообщения вам будет показано, что вы хотите запустить перезагрузку, так что вот post, который расскажет вам, как это сделать.
Более жестоким подходом является вызов Process.GetCurrentProcess(). Kill() Не очень грациозно, но если ваш сайт имеет свой собственный пул приложений, и вам все равно, что текущие запросы жестоко прекращаются, это довольно эффективно!
Упрощенная версия 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