我们有一个ASP.NET MVC 4应用程序,它链接到旧版本机代码。问题是这个遗留代码具有在启动时构建的全局静态代码,但由于本机代码对App Domains一无所知,因此在重新加载App Domain时不会重新初始化该代码。在重新启动应用程序池进程之前,这会导致我们的应用程序出现不正确的行为或崩溃。
因此,我想强制应用程序池在我们的应用程序的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 );
}
答案 0 :(得分:3)
更残酷的方法是调用Process.GetCurrentProcess()。Kill() 不是很优雅,但是如果你的网站有自己的应用程序池,你不关心任何当前的请求被残酷地停止,这是非常有效的!
答案 1 :(得分:2)
根据你的帖子显示,你知道什么时候想要触发重启,所以这里有一个post会告诉你如何。
答案 2 :(得分:2)
您共享的代码的简化VB版本。此版本使用For循环而不是LINQ查询。此外,要使用Microsoft.Web.Administration,您必须从c:\ windows \ system32 \ inetsrv
导入DLLImports 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