网上新建程序池的方法很多,唯独删除程序池方法比较少,所以我记录下删除程序池的方法。


网上找到这种

///<summary>///删除指定程序池-虚拟机上跑不通///</summary>///<paramname="appPoolName">程序池名称</param>///<returns>true删除成功false删除失败</returns>publicstaticboolDeleteAppPool(stringappPoolName){Logger.Info("InMethodDeleteAppPool()");boolresult=false;DirectoryEntryappPools=newDirectoryEntry("IIS://localhost/W3SVC/AppPools");foreach(DirectoryEntryentryinappPools.Children){Logger.Info("InEntry:"+entry.Name);if(entry.Name.Equals(appPoolName)){try{Logger.Info("deleteEntry:"+entry.Name);entry.DeleteTree();Logger.Info("deletesuccess");result=true;break;}catch{result=false;}}}returnresult;}


试了下本地能跑通,虚拟机上跑不通,报的错毫无用处,不知道怎么办的情况下问了下我领导,我领导提示我用ServerManage的山删除方法,于是有了

///<summary>///根据程序池名称删除程序池-好用///</summary>///<paramname="poolName"></param>publicstaticvoidDeleteAppPool(stringpoolName){Logger.Info("inDeleteAppPool()");ServerManagermanager=newServerManager();manager.ApplicationPools.Remove(manager.ApplicationPools[poolName]);Logger.Info("FInishRemove:"+poolName);manager.CommitChanges();Logger.Info("finshcommit");}

期间,走了很多弯路,现在解释下。

因为我要实现的方法是删除服务器上所有不在使用的程序池,所以开始思路是

由于没有找到方法来获取Application下面应用程序,就不好判断程序池在不在使用中,所以用以下方法来判断程序池是不是在使用中:

获取ServerManager的Site,获取Site的Application,获取Application的ApplicationPoolName,存入使用中程序池列表中,

获取ServerManager的ApplicationPools,用foreanch遍历每个Pool,如该Pool不在使用中程序池列表中,就调用ServerManager.ApplicationPools.Remove方法删除


代码如下:



publicstaticList<string>GetAppPoolNameInUse(){ServerManagermanager=newServerManager();ApplicationPoolCollectionpools=manager.ApplicationPools;SiteCollectionsites=manager.Sites;List<string>poolnameinuse=newList<string>();foreach(Sitesiteinsites){ApplicationCollectionapplications=site.Applications;foreach(Applicationapplicationinapplications){stringname=application.ApplicationPoolName;if(!poolnameinuse.Contains(name)){poolnameinuse.Add(name);}}}returnpoolnameinuse;}publicstaticvoidClearAppPoolNotInUse(){List<string>poolnameinuse=GetAppPoolNameInUse();List<string>poolnamenotinuse=newList<string>();ServerManagermanager=newServerManager();ApplicationPoolCollectionapppools=manager.ApplicationPools;foreach(ApplicationPoolpoolinapppools){if(!poolnameinuse.Contains(pool.Name)){manager.ApplicationPools.Remove(pool);}}manager.CommitChanges();}


遍历时第一次时候正常,第二个时就会报错,报错如下:


Exception:2015/8/27 13:06:49异常信息:System.InvalidOperationException: Collecti

on was modified; enumeration operation may not execute.

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resour

ce)

at System.Collections.Generic.List`1.Enumerator.MoveNextRare()

at System.Collections.Generic.List`1.Enumerator.MoveNext()

at MonitorWarning.IISUtil.ClearAppPoolNotInUse() in d:\Ctrip_Hotel\study_demo

\MonitorWarning\MonitorWarning\IISUtil.cs:line 1010

at MonitorWarning.Program.Main(String[] args) in d:\Ctrip_Hotel\study_demo\Mo

nitorWarning\MonitorWarning\Program.cs:line 24(System.InvalidOperationException:

Collection was modified; enumeration operation may not execute.

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resour

ce)

at System.Collections.Generic.List`1.Enumerator.MoveNextRare()

at System.Collections.Generic.List`1.Enumerator.MoveNext()

at MonitorWarning.IISUtil.ClearAppPoolNotInUse() in d:\Ctrip_Hotel\study_demo

\MonitorWarning\MonitorWarning\IISUtil.cs:line 1010

at MonitorWarning.Program.Main(String[] args) in d:\Ctrip_Hotel\study_demo\Mo

nitorWarning\MonitorWarning\Program.cs:line 24)

Finished


分析后发现foreach中Applications第二次用的时候由于上一次有remove而不能用了。考虑用以下方法:

每次传入一个需要删除的applicationname,

然后像事务一样,需新建一个servermanager,用该servermanager得到application,再用该manager删除这个application


代码如下:

#region清除不在使用中的程序池publicstaticList<string>GetAppPoolNameInUse(){ServerManagermanager=newServerManager();ApplicationPoolCollectionpools=manager.ApplicationPools;SiteCollectionsites=manager.Sites;List<string>poolnameinuse=newList<string>();foreach(Sitesiteinsites){ApplicationCollectionapplications=site.Applications;foreach(Applicationapplicationinapplications){stringname=application.ApplicationPoolName;if(!poolnameinuse.Contains(name)){poolnameinuse.Add(name);}}}returnpoolnameinuse;}publicstaticvoidClearAppPoolNotInUse(){List<string>poolnameinuse=GetAppPoolNameInUse();List<string>poolnamenotinuse=newList<string>();ServerManagermanager=newServerManager();ApplicationPoolCollectionapppools=manager.ApplicationPools;foreach(ApplicationPoolpoolinapppools){if(!poolnameinuse.Contains(pool.Name)){poolnamenotinuse.Add(pool.Name);}}foreach(stringnameinpoolnamenotinuse){DeleteAppPool(name);}}///<summary>///根据程序池名称删除程序池///</summary>///<paramname="poolName"></param>publicstaticvoidDeleteAppPool(stringpoolName){Logger.Info("inDeleteAppPool()");ServerManagermanager=newServerManager();manager.ApplicationPools.Remove(manager.ApplicationPools[poolName]);Logger.Info("FInishRemove:"+poolName);manager.CommitChanges();Logger.Info("finshcommit");}#endregion

如此就能正常工作了。