我们有一个链接到旧本机代码的 ASP.NET MVC 4 应用程序。问题是这个遗留代码具有在启动时构建的全局静态,但由于本机代码对应用程序域一无所知,因此在重新加载应用程序域时,该代码不会重新初始化。这会导致我们的应用程序出现错误行为或崩溃,直到重新启动应用程序池进程。
因此,每当我们的应用程序的应用程序域被回收时,我想强制应用程序池进行回收。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 );
}