5

我正在尝试以编程方式从 IIS 获取我的站点状态,以查看它是否已停止,但我不断收到以下错误,

对象标识符不代表有效对象。(来自 HRESULT 的异常:0x800710D8)

该应用程序正在使用 ServerManager Site 类来访问站点状态。这是代码,

//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的东西吗?

4

2 回答 2

7

我弄清楚问题出在哪里。基本上,服务器管理器有两个部分,服务器管理器的第一部分允许您从配置文件中读取站点详细信息,这就是我在上面所做的。这样做的问题是您只能获取文件中的信息,而站点状态不是其中的一部分。

服务器管理器的第二部分允许您直接连接到 IIS,它通过与 COM 元素交互来实现。所以我应该做的是:

ServerManager manager= ServerManager.OpenRemote("testserver");
var site = manager.Sites.First();
var status = site.State.ToString() ;
于 2012-12-12T23:49:24.167 回答
2

我有一个类似的问题,但我的问题是由于激活对 ServerManager 对象上的 CommitChanges 调用的更改所需的延迟引起的。我在这里找到了我需要的答案:

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);
        ...
于 2015-06-01T14:38:11.240 回答