1

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

您登录到该站点并选择应用程序池监视器。有一个下拉菜单可让您选择要查找的服务器。我有一个存储过程,它将从该服务器中提取应用程序池并将它们显示在网格中。然后我有我正在测试的这段代码:

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 和权限。

我为 IIS6 使用 DirectoryEntry,它工作得很好,但它不适用于 IIS7。

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

任何帮助,将不胜感激。

编辑:我在目录服务中遇到的异常是 System.Runtime.InteropServices.COMException

4

1 回答 1

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。确保IIS Admin Service正在运行。现在尝试调用该命令并查看它是否有效。

于 2013-08-20T17:01:01.987 回答