網(wǎng)上新建程序池的方法很多,唯獨刪除程序池方法比較少,所以我記錄下刪除程序池的方法。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、雅安服務器托管、營銷軟件、網(wǎng)站建設、貢井網(wǎng)站維護、網(wǎng)站推廣。網(wǎng)上找到這種
////// 刪除指定程序池 -虛擬機上跑不通 /// /// 程序池名稱 ///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的山刪除方法,于是有了
////// 根據(jù)程序池名稱刪除程序池 - 好用 /// /// 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"); }
期間,走了很多彎路,現(xiàn)在解釋下。
因為我要實現(xiàn)的方法是刪除服務器上所有不在使用的程序池,所以開始思路是
由于沒有找到方法來獲取Application下面應用程序,就不好判斷程序池在不在使用中,所以用以下方法來判斷程序池是不是在使用中:
獲取ServerManager的Site,獲取Site的Application,獲取Application的ApplicationPoolName,存入使用中程序池列表中,
獲取ServerManager的ApplicationPools,用foreanch遍歷每個Pool,如該Pool不在使用中程序池列表中,就調(diào)用ServerManager.ApplicationPools.Remove方法刪除
代碼如下:
public static ListGetAppPoolNameInUse() { 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
分析后發(fā)現(xiàn)foreach中Applications第二次用的時候由于上一次有remove而不能用了。考慮用以下方法:
每次傳入一個需要刪除的applicationname,
然后像事務一樣,需新建一個servermanager,用該servermanager得到application,再用該manager刪除這個application
代碼如下:
#region 清除不在使用中的程序池 public static ListGetAppPoolNameInUse() { 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); } } /// /// 根據(jù)程序池名稱刪除程序池 /// /// 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
如此就能正常工作了。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。