使用C#回收IIS7应用程序池

时间:2013-08-20 16:04:24

标签: c# sql stored-procedures application-pool

我已经阅读了这里有关如何以编程方式执行此操作的所有线程,但我无法让它工作。关于我的代码如何工作的一点背景。

您登录该站点并选择“应用程序池”监视器。有一个下拉列表,允许您选择您要查找的服务器。我有一个存储过程,将从该服务器中提取应用程序池并将其显示在网格中。然后我有我正在测试的代码:

while (rdr.Read())
{
     string appPool = rdr["AppPoolName"].ToString();
     string permission = rdr["Permission"].ToString();
     string serverIP = rdr["ServerIP"].ToString();

     if (permission == "E")
     {
          lblErrorStart.Visible = false;

          using (var serverManager = ServerManager.OpenRemote(serverIP))
          {
               ApplicationPool poolName = serverManager.ApplicationPools[appPool];
               poolName.Stop();
               lblSuccess.Visible = true;
          }
     }

     else
     {
          lblErrorStart.Visible = true;
     }
}

我创建的阅读器汇集了SQL的AppPoolName,ServerIP和Permission。

我使用DirectoryEntry for IIS6,它运行良好,但它不适用于IIS7。

using (DirectoryEntry w3svc = new DirectoryEntry(string.Format("IIS://" + serverIP + "/W3SVC/AppPools/" + appPool)))
{
     w3svc.Invoke("Recycle", null);
     lblSuccess.Visible = true;
}

任何帮助都将不胜感激。

编辑:目录服务的异常是System.Runtime.InteropServices.COMException

1 个答案:

答案 0 :(得分:2)

你怎么知道它不起作用?您如何真正知道应用程序池是否已被回收?几个月前我们遇到了这个问题,并试图找出一种方法,看看它是否真的可以回收利用。我们在IIS中打开了跟踪但它没有记录任何消息,我们认为这意味着它无法正常工作。我们当时所做的是创建一个虚拟服务和一个控制台应用程序,每隔0.5秒就可以ping一次该服务。然后,我们回收了托管该服务的AppPool,奇怪的是,我们看到了ping响应的延迟,这意味着它实际上已经回收了。

尝试将w3svc.Invoke("Recycle", null);更改为w3svc.Invoke("Stop", null);。如果这会停止AppPool,那么您几乎可以确定Recycle可以正常工作。请注意,调用Recycle操作不会阻止,因此如果您的代码依赖于AppPool在循环后启动并运行,则需要在继续之前检查其状态。

编辑:

试一试:

Windows Features窗口中,确保已启用IIS 6 Management Compatibility

enter image description here

打开“开始”菜单并输入“services”,然后按Enter键。确保IIS Admin Service正在运行。现在尝试调用该命令,看看它是否有效。