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

网上找到这种

///           ///     删除指定程序池  -虚拟机上跑不通        ///           /// 
程序池名称          /// 
true删除成功 false删除失败
          public static bool DeleteAppPool(string appPoolName)        {            Logger.Info("In Method  DeleteAppPool()");            bool result = false;            DirectoryEntry appPools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");            foreach (DirectoryEntry entry in appPools.Children)            {                Logger.Info("In Entry :" + entry.Name);                if (entry.Name.Equals(appPoolName))                {                    try                    {                        Logger.Info("delete Entry :" + entry.Name);                        entry.DeleteTree();                        Logger.Info("delete success");                        result = true;                        break;                    }                    catch                    {                        result = false;                    }                }            }            return result;        }

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

///         /// 根据程序池名称删除程序池 - 好用        ///         /// 
        public static void DeleteAppPool(string poolName)        {            Logger.Info("in DeleteAppPool()");            ServerManager manager = new ServerManager();            manager.ApplicationPools.Remove(manager.ApplicationPools[poolName]);            Logger.Info("FInish Remove:" + poolName);            manager.CommitChanges();            Logger.Info("finsh commit");        }

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

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

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

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

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

    代码如下: 

  3. public static List
     GetAppPoolNameInUse()        {            ServerManager manager = new ServerManager();            ApplicationPoolCollection pools = manager.ApplicationPools;            SiteCollection sites = manager.Sites;            List
     poolnameinuse = new List
    ();            foreach (Site site in sites)            {                ApplicationCollection applications = site.Applications;                foreach (Application application in applications)                {                    string name = application.ApplicationPoolName;                    if (!poolnameinuse.Contains(name))                    {                        poolnameinuse.Add(name);                    }                }            }            return poolnameinuse;        }        public static void ClearAppPoolNotInUse()        {            List
     poolnameinuse = GetAppPoolNameInUse();            List
     poolnamenotinuse = new List
    ();            ServerManager manager = new ServerManager();            ApplicationPoolCollection apppools = manager.ApplicationPools;            foreach (ApplicationPool pool in apppools)            {                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 清除不在使用中的程序池        public static List
 GetAppPoolNameInUse()        {            ServerManager manager = new ServerManager();            ApplicationPoolCollection pools = manager.ApplicationPools;            SiteCollection sites = manager.Sites;            List
 poolnameinuse = new List
();            foreach (Site site in sites)            {                ApplicationCollection applications = site.Applications;                foreach (Application application in applications)                {                    string name = application.ApplicationPoolName;                    if (!poolnameinuse.Contains(name))                    {                        poolnameinuse.Add(name);                    }                }            }            return poolnameinuse;        }        public static void ClearAppPoolNotInUse()        {            List
 poolnameinuse = GetAppPoolNameInUse();            List
 poolnamenotinuse = new List
();            ServerManager manager = new ServerManager();            ApplicationPoolCollection apppools = manager.ApplicationPools;            foreach (ApplicationPool pool in apppools)            {                if (!poolnameinuse.Contains(pool.Name))                {                    poolnamenotinuse.Add(pool.Name);                }            }            foreach (string name in poolnamenotinuse)            {                DeleteAppPool(name);            }        }        /// 
        /// 根据程序池名称删除程序池        ///         /// 
        public static void DeleteAppPool(string poolName)        {            Logger.Info("in DeleteAppPool()");            ServerManager manager = new ServerManager();            manager.ApplicationPools.Remove(manager.ApplicationPools[poolName]);            Logger.Info("FInish Remove:" + poolName);            manager.CommitChanges();            Logger.Info("finsh commit");        }        #endregion

如此就能正常工作了。