每当重新加载App域时,如何强制IIS应用程序池重新启动?

时间:2012-08-07 14:52:00

标签: asp.net iis asp.net-mvc-4 appdomain application-pool

我们有一个ASP.NET MVC 4应用程序,它链接到旧版本机代码。问题是这个遗留代码具有在启动时构建的全局静态代码,但由于本机代码对App Domains一无所知,因此在重新加载App Domain时不会重新初始化该代码。在重新启动应用程序池进程之前,这会导致我们的应用程序出现不正确的行为或崩溃。

因此,我想强制应用程序池在我们的应用程序的App Domain被回收时进行回收。在IIS中是否有这样的设置,或者是否有代码可以在我的应用程序中调用,因为域正在被卸载?

有关我的设置的一些信息,

  1. ASP.NET MVC 4应用程序
  2. IIS 7.5,但如果需要,我可以移至8
  3. 我可以确保每个应用程序池都有一个应用程序,因此我不会影响其他应用程序。
  4. 更新

    基于下面的答案,我连接到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 );
    }
    

3 个答案:

答案 0 :(得分:3)

更残酷的方法是调用Process.GetCurrentProcess()。Kill() 不是很优雅,但是如果你的网站有自己的应用程序池,你不关心任何当前的请求被残酷地停止,这是非常有效的!

答案 1 :(得分:2)

根据你的帖子显示,你知道什么时候想要触发重启,所以这里有一个post会告诉你如何。

答案 2 :(得分:2)

您共享的代码的简化VB版本。此版本使用For循环而不是LINQ查询。此外,要使用Microsoft.Web.Administration,您必须从c:\ windows \ system32 \ inetsrv

导入DLL
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