如何使用Web管理C#在IIS 7中获取站点ID和站点状态

时间:2013-10-22 14:29:20

标签: c# iis-7 web-administration

我需要帮助使用Web管理在IIS7上获取站点ID和状态。我有这个代码

 private string getSiteIdByName(string siteName)
    {
        DirectoryEntry root = getDirectoryEntry("IIS://" + textServer.Text + "/W3SVC");
        foreach (DirectoryEntry e in root.Children)
        {
            if (e.SchemaClassName == "IIsWebServer")
            {
                if (e.Properties["ServerComment"].Value.ToString().Equals(siteName, StringComparison.OrdinalIgnoreCase))
                {
                    return e.Name;
                }
            }
        }
        return null;
    }



  private void showStatus(string siteId)
        {
            string result = "unknown";
            DirectoryEntry root = getDirectoryEntry("IIS://" + textServer.Text + "/W3SVC/" + siteId);
            PropertyValueCollection pvc;
            pvc = root.Properties["ServerState"];
            if (pvc.Value != null)
                result = (pvc.Value.Equals((int)ObjectState.Start) ? "Running" :
                          pvc.Value.Equals((int)ObjectState.Stop) ? "Stopped" :
                          pvc.Value.Equals((int)ObjectState.Pause) ? "Paused" :
                          pvc.Value.ToString());
            labelStatus.Text = result + " (" + pvc.Value + ")";
        }

但它确实不适用于我们的一些服务器。有没有办法使用Web管理?非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

通过一些研究,您会发现您所谈论的WebAdministration API只不过是一个美化的XML文件管理器,IIS竭尽全力向您隐瞒。此外,如果您在多个Web服务器上“反映”,API往往会表现得非常糟糕;它是在引擎盖下使用DCOM,所以你可能实际上并不感兴趣的是很多的开销。

过去,当我遇到这种情况时,我学会了绕过Web管理,只是用LINQ to XML打开XML文件。一旦你开始查看它,文件结构就不那么复杂了。

这是一个标准.config文件,位于C:\Windows\System32\inetsrv\config\applicationHost.config

如果要跨服务器访问它,请使用URI:

file://myserver/c$/windows/system32/inetsrv/config/applicationHost.config

请注意,这可能会有问题,具体取决于您的应用程序运行的帐户是否可以访问您正在使用的共享。

然后,只需使用LINQ to XML解析它或使用Configuration命名空间中的类加载它。

顺便说一下,此配置文件包含站点ID,虚拟目录路径,物理路径,应用程序池信息以及您可能想要了解的有关服务器上每个站点的所有信息。

祝你好运。

答案 1 :(得分:0)

我绝对不建议手动解析XML,因为正如其他人所建议的那样,正确地解决它有很多复杂性,例如加密,默认值的继承以及许多其他可能会出错的问题。这也意味着你无法访问运行时状态,这样做实际上非常简单:

using(ServerManager serverManager = new ServerManager()) {
    var state = serverManager.Sites[siteName].State;
}

请参阅:enter link description here