Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式从IIS获取站点状态,返回COM错误_C#_Iis_Iis 7_Configuration_Servermanager - Fatal编程技术网

C# 以编程方式从IIS获取站点状态,返回COM错误

C# 以编程方式从IIS获取站点状态,返回COM错误,c#,iis,iis-7,configuration,servermanager,C#,Iis,Iis 7,Configuration,Servermanager,我试图以编程方式从IIS获取我的站点状态,以查看它是否已停止,但我一直收到以下错误 对象标识符不表示有效的对象。(来自HRESULT的异常:0x800710D8) 应用程序正在使用ServerManager站点类访问站点状态。这是密码 //This is fine, gets back the site var serverManager = new Microsoft.Web.Administration.ServerManager(ConfigPath); var site = serve

我试图以编程方式从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的问题吗?

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

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

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

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

似乎需要轮询才能获得一致的结果。类似的方法解决了我的问题(我在访问新添加的应用程序池时遇到异常):

。。。
创建新的应用程序池
...
斯曼。佣金();
int i=0;
常数int max=10;
做
{
i++;
尝试
{
if(ObjectState.Stopped==pool.State)
{
写入日志(“池已停止,启动:“+Pool.Name”);
pool.Start();
}
斯曼。佣金();
打破
}
捕获(System.Runtime.InteropServices.COMException e)
{
如果(i
非常简单,非常有用。谢谢!这是正确的,一般来说,正如MSDN中所记录的,永远不应该使用接收物理路径的ServerManager的构造函数重载,也就是说,对于内部基础结构,正如您所看到的,如果使用它,可能会产生非常有害的影响。最糟糕的是删除错误的SSL配置和证书,这些配置和证书可能会破坏您的配置,因此,如果尝试管理远程计算机,请使用OpenRemote only。这也是我的问题,帮助伙伴+1:)
        ...
        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);
        ...