【问题标题】:Recycle IIS7 Application Pool with C#使用 C# 回收 IIS7 应用程序池
【发布时间】:2013-08-20 16:04:24
【问题描述】:

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

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

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;
     }
}

我创建的阅读器将 AppPoolName、ServerIP 和来自 SQL 的权限汇集在一起​​。

我为 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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果你循环使用,由于w3wp进程被终止并创建了一个新的进程,所以PID会改变。我的 PID 永远不会改变。
    • 好吧,还有其他事情正在发生。你没有例外,是吗?我还假设您尝试过以管理员身份运行该应用程序?
    • @Matt 更新了我的答案,再试一次。
    • 我检查了我尝试访问的服务器,并且安装了除控制台之外的所有 IIS6 管理兼容性选项。 IIS 服务也在运行。我也没有例外。但是,我在单步执行代码时遇到问题。它需要通过一个正在搞砸调试的登录页面。我可能只是创建一个控制台应用程序并尝试相同的代码并以这种方式逐步执行。
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2013-09-01
    • 1970-01-01
    • 2015-01-07
    • 2011-07-02
    • 2011-01-16
    • 2012-08-31
    • 2011-09-20
    相关资源
    最近更新 更多