10

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

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

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

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

更新

根据下面的答案,我连接了 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 );
}
4

3 回答 3

3

更残忍的方法是调用 Process.GetCurrentProcess().Kill() 不是很优雅,但是如果你的站点有自己的应用程序池并且你不在乎任何当前的请求被残忍地停止,那是相当有效的!

于 2013-11-07T05:58:16.437 回答
3

您共享的代码的简化 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
于 2014-04-14T01:14:25.030 回答
2

根据您的帖子,您似乎知道何时要触发重新启动,因此这里有一个重新启动(回收)应用程序池帖子,它将告诉您如何操作。

于 2012-08-07T18:11:56.170 回答