You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证Microsoft.Web.Administration ObjectState以解决IIS站点状态错误

解决IIS站点ObjectState读取异常问题

问题背景

使用C#代码获取IIS非默认站点列表时,读取site.State.ToString()抛出如下异常:

'The object identifier does not represent a valid object. (Exception from HRESULT: 0x800710D8)'

注释该行后代码可正常运行,推测是某个站点的State处于无效状态。尝试直接用if (site.State)判断时,出现编译错误:

CS0029: Cannot implicitly convert type 'Microsoft.Web.Administration.ObjectState' to 'bool'

解决方案

ObjectState是枚举类型,不能直接转换为bool值,以下两种方式可以正确处理无效状态:

方式一:捕获State读取异常

在读取单个站点的State时单独捕获异常,将无效状态标记为"unknown":

List<IISObject> iisSiteList = new List<IISObject>();

ServerManager serverMgr = new ServerManager();
SiteCollection sitecollection = serverMgr.Sites;

try
{
    foreach (var site in sitecollection)
    {
        if (site.Name != "Default Web Site")
        {
            string siteState = "unknown";
            try
            {
                siteState = site.State.ToString();
            }
            catch
            {
                // 忽略State读取失败的异常,保持状态为unknown
            }

            IISObject issObject = new IISObject() 
            { 
                Name = site.Name, 
                SiteId = site.Id, 
                State = siteState 
            };
            iisSiteList.Add(issObject);
        }
    }

    return iisSiteList;
}
catch (Exception e)
{
    // 统一返回类型,避免原代码中List和string返回类型冲突的问题
    return new List<IISObject>();
}

方式二:检查枚举有效值

ObjectState的有效值为Started、Starting、Stopped、Stopping,先判断当前State是否属于有效值范围:

List<IISObject> iisSiteList = new List<IISObject>();

ServerManager serverMgr = new ServerManager();
SiteCollection sitecollection = serverMgr.Sites;
// 定义有效的ObjectState枚举值集合
var validStates = new HashSet<ObjectState> 
{ 
    ObjectState.Started, 
    ObjectState.Starting, 
    ObjectState.Stopped, 
    ObjectState.Stopping 
};

try
{
    foreach (var site in sitecollection)
    {
        if (site.Name != "Default Web Site")
        {
            string siteState = validStates.Contains(site.State) 
                ? site.State.ToString() 
                : "unknown";

            IISObject issObject = new IISObject() 
            { 
                Name = site.Name, 
                SiteId = site.Id, 
                State = siteState 
            };
            iisSiteList.Add(issObject);
        }
    }

    return iisSiteList;
}
catch (Exception e)
{
    return new List<IISObject>();
}

额外说明

  • 原代码存在返回类型不一致的问题(同时返回List<IISObject>和string),这会导致编译错误,建议统一返回类型,比如始终返回List<IISObject>,异常时返回空列表。
  • 0x800710D8异常通常是由于站点配置损坏、关联应用程序池不存在或资源不可用导致State无法正常读取,上述两种方案均可绕过该问题。

内容的提问来源于stack exchange,提问作者Umar Draz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:40