繁体   English   中英

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

[英]Recycle IIS7 Application Pool with C#

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

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

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用于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

您怎么知道它不起作用? 您如何才能真正知道应用程序池是否已回收? 几个月前,我们遇到了这个问题,并试图找到一种方法来查看它是否真正在回收。 我们在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正在运行。 现在尝试调用该命令,看看它是否有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM