编程得到IIS站点状态,回来COM错误(Programmatically get site stat

2019-08-03 13:07发布

我想以编程方式让我的网站的状态从IIS,看它是否停了,但我一直得到下面的错误,

对象标识符没有表示一个有效的对象。 (从HRESULT异常:0x800710D8)

应用程序使用ServerManager的站点类访问该网站的地位。 下面是代码,

//This is fine, gets back the site 
var serverManager = new Microsoft.Web.Administration.ServerManager(ConfigPath);
var site = serverManager.Sites.FirstOrDefault(x => x.Id == 5);
if (site == null) return;
var appPoolName = site.Applications["/"].ApplicationPoolName;
//error!
var state = site.State;

我已经测试与静态站点来隔离问题,确保该网站是启动和运行,所有的配置都是有效的,点到有效的应用程序池...等。

让我知道,如果你需要更多的细节。 难道是COM的事情吗?

Answer 1:

我想通了,问题出在哪里。 基本上有两个部分的服务器管理器,服务器管理人员的第一部分,允许你从配置文件,这是我一直在上面做什么阅读网站的详细信息。 但问题是,你将只能得到这是在文件和网站的状态不是它的一部分的信息。

服务器管理器的第二部分,您可以直接连接到IIS,它通过与COM元件相互作用做到这一点。 所以,我应该做的是这样的:

ServerManager manager= ServerManager.OpenRemote("testserver");
var site = manager.Sites.First();
var status = site.State.ToString() ;


Answer 2:

我有一个类似的问题,但我的被激活,从调用的CommitChanges的ServerManager的对象上的变化所需的延迟造成的。 我发现我需要这里的答案:

ServerManager的的CommitChanges使得稍微延迟变化

好像需要轮询来获得一致的结果。 同样的事情也该解决了我的问题(我访问新增加应用程序池时除外):

        ...
        create new application pool
        ...
        sman.CommitChanges();
        int i = 0;
        const int max = 10;
        do
        {
            i++;
            try
            {
                if (ObjectState.Stopped == pool.State)
                {
                    write_log("Pool was stopped, starting: " + pool.Name);
                    pool.Start();
                }
                sman.CommitChanges();
                break;
            }
            catch (System.Runtime.InteropServices.COMException e)
            {
                if (i < max)
                {
                    write_log("Waiting for IIS to activate new config...");
                    Thread.Sleep(1000);
                }
                else
                {
                    throw new Exception(
                        "CommitChanges timed out efter " + max + " attempts.",
                        e);
                }
            }
        } while (true);
        ...


文章来源: Programmatically get site status from IIS, gets back COM error