如何验证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
相关产品推荐
相关产品推荐

