網上新建程序池的方法很多,唯獨刪除程序池方法比較少,所以我記錄下刪除程序池的方法。
網上找到這種
/// <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下面應用程序,就不好判斷程序池在不在使用中,所以用以下方法來判斷程序池是不是在使用中:
獲取ServerManager的Site,獲取Site的Application,獲取Application的ApplicationPoolName,存入使用中程序池列表中,
獲取ServerManager的ApplicationPools,用foreanch遍歷每個Pool,如該Pool不在使用中程序池列表中,就調用ServerManager.ApplicationPools.Remove方法刪除
代碼如下:
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如此就能正常工作了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。