中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

刪除程序池

發布時間:2020-07-07 16:25:32 來源:網絡 閱讀:392 作者:sudachenjiazhu 欄目:編程語言

網上新建程序池的方法很多,唯獨刪除程序池方法比較少,所以我記錄下刪除程序池的方法。


網上找到這種

/// <summary>  
        ///     刪除指定程序池  -虛擬機上跑不通
        /// </summary>  
        /// <param name="appPoolName">程序池名稱</param>  
        /// <returns>true刪除成功 false刪除失敗</returns>  
        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的山刪除方法,于是有了

/// <summary>
        /// 根據程序池名稱刪除程序池 - 好用
        /// </summary>
        /// <param name="poolName"></param>
        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<string> GetAppPoolNameInUse()
            {
                ServerManager manager = new ServerManager();
                ApplicationPoolCollection pools = manager.ApplicationPools;
                SiteCollection sites = manager.Sites;
                List<string> poolnameinuse = new List<string>();
                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<string> poolnameinuse = GetAppPoolNameInUse();
                List<string> poolnamenotinuse = new List<string>();
                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<string> GetAppPoolNameInUse()
        {
            ServerManager manager = new ServerManager();
            ApplicationPoolCollection pools = manager.ApplicationPools;
            SiteCollection sites = manager.Sites;
            List<string> poolnameinuse = new List<string>();
            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<string> poolnameinuse = GetAppPoolNameInUse();
            List<string> poolnamenotinuse = new List<string>();
            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);
            }
        }
        /// <summary>
        /// 根據程序池名稱刪除程序池
        /// </summary>
        /// <param name="poolName"></param>
        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

如此就能正常工作了。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文成县| 溆浦县| 织金县| 宁乡县| 潢川县| 响水县| 丰台区| 周至县| 含山县| 鄂温| 曲阜市| 舞钢市| 刚察县| 霍林郭勒市| 晋城| 西乌珠穆沁旗| 河北省| 玉龙| 石家庄市| 吴江市| 苏尼特左旗| 连州市| 崇州市| 恩平市| 封开县| 长治市| 八宿县| 嵩明县| 福鼎市| 修文县| 宜兴市| 曲麻莱县| 姚安县| 修水县| 博湖县| 隆尧县| 中牟县| 荥经县| 镇沅| 正蓝旗| 阜新市|