一個應用程式池可以有多個站點,一個站點隻對應一個應用程式池。
程式設計由來:
存放在一個應用程式池裡的站點過多就不便于操作,是以需把其中一些站點配置設定到其他程式池中。
程式設計題目:
使用者輸入一個數字或者一個數字+一個名字。程式對站點的所在應用程式池進行統計,使用者輸入的數字用于限制應用程式池裡面的最大容量數,如果超出該容量,将把超出的站點配置設定到其他程式應用池,或者建立的一個應用程式池,把站點配置設定進去。
如果使用者輸入一個數字的情況,将周遊所有程式應用池;如果使用者輸入一個數字+一個名字的情況,将隻對該名字的應用程式池進行操作;如果站點的名字和應用程式池的名字一樣,将不進行操作。
條件:
一、把DefautlAppPool應用程式池或者含有字元"AppPool #"的應用程式池裡面的超出的站點配置設定到AppPool #?應用程式池中("?"代表數字)
二、如果aspnet1應用程式池裡面的網站數超出使用者限制的數字,則配置設定到建立應用程式池的命名方式為aspnet1-?;("?"代表數字,表示從屬aspnet1下的分支)
三、如二設定aspnet2,aspnet3,aspnet4應用程式池
四、當網站名字和應用程式池的名字相同時,将不進行操作
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
這是我在公司裡面的任務,以下是我公開的代碼(還不屬于最優化的代碼,我把我的制作品拿出來以代表原創性,最優化的代碼暫時不公布,如有需要,請聯系部落客!)
建立一個控制台應用程式(C#程式設計語言,使用vs2005版本制作)
添加引用:System.DirectoryServices
class Program
{
static Hashtable hs = new Hashtable();//建立哈希表,儲存池中的站點
static string[] pls;//池數組
static string[] nums;//應用程式池中各自包含的網站數量
static Hashtable boolhs = new Hashtable();//建立哈希表,儲存池中站點數量是否滿
static void Main(string[] args)
{
string strNum = Console.ReadLine();//使用者輸入資訊
pls = GetApplicationPools();//擷取應用程式池名稱數組
foreach (string i in pls)//填充哈希表key值内容
{
hs.Add(i, "");
boolhs.Add(i, "false");
}
getpoolweb();
WebNums();
if (strNum.Length > 1)//判斷使用者輸入的數字+名稱
string[] pw = strNum.Split(' ');
for (int i = 0; i < pls.Length; i++)
{
if (pls[i] == pw[1])
{
if (int.Parse(nums[i]) > int.Parse(pw[0]))
{
boolhs[pls[i]] = "true";//将該池定義站點數量已滿
GetName(pw[1], int.Parse(pw[0]), int.Parse(nums[i]));
Console.WriteLine("編譯完畢!");
}
else Console.WriteLine("該"+pw[1].ToString()+"應用程式池不需進行操作!");
}
}
else//判斷使用者輸入的數字
if (int.Parse(nums[i]) > int.Parse(strNum))//如果超出
boolhs[pls[i]] = "true";//将該池定義站點數量已滿
GetName(pls[i], int.Parse(strNum), int.Parse(nums[i]));
Console.WriteLine("編譯完畢!");
Console.ReadLine();
}
/// <summary>
/// 判斷網站名與應用程式池名稱是否相等
/// </summary>
/// <param name="wnames">網站名稱</param>
/// <returns>相等為假</returns>
public static bool chname(string wnames)
bool ctf = true;
foreach (string i in pls)
if (wnames == i)
ctf = false;
else ctf = true;
return ctf;
/// 獲得池數組對應的網站數量
static void WebNums()
List<string> weblist = new List<string>();
//string[] poolns = pooln.Split(',');
if (hs[i].ToString() != "")
weblist.Add(hs[i].ToString().Split(',').Length.ToString());
else
weblist.Add("0");
nums = weblist.ToArray();
///<summary>
///檢測應用程式池的名稱
///</summary>
///<param name="AppPoolName">應用程式池的名稱</param>
///<param name="c">指定的限制數</param>
///<param name="inn">該池中網站的數量</param>
///<returns></returns>
static void GetName(string AppPoolName, int c, int inn)
int si = inn - c;//舊池中站點剩餘量
string[] kt = hs[AppPoolName].ToString().Split(',');
while (true)
int ting = 0;
foreach (string w in pls)
if (boolhs[w].ToString() == "true")
ting += 1;
if (ting >= pls.Length) break;
if (boolhs[pls[i]].ToString() == "false")//如果哪個池的站點量可以容納
{
int d = c - int.Parse(nums[i]);
if (si < c)
for (int j = 0; j < si; j++)
if (chname(kt[j]))//判斷名稱是否存在
movepool(kt[j], AppPoolName, pls[i]);//轉移站點
else
for (int j = 0; j < d; j++)
if (chname(kt[j]))
movepool(kt[j], AppPoolName, pls[i]);
if (si-d < 0) break;
si = si - d;
boolhs[pls[i]] = "true";
//需要建立的情況
if(si>0)
int sy = int.Parse(Math.Ceiling((double)si / (double)c).ToString());//建立多少個
for (int j = 1; j <= sy; j++)
string ne = "";
bool bname = false;
int s = 1;
while (bname == false)
if (AppPoolName.StartsWith("aspnet")) ne = AppPoolName + "-" + s;
else if (AppPoolName.StartsWith("DefaultAppPool") && AppPoolName.StartsWith("AppPool #")) ne = AppPoolName + s;
bool bne = false;//判斷名稱是否存在
foreach (string n in pls)
if (n == ne)
{
bne = true;
break;
}
if (bne == true)
s += 1;
else bname = true;
AddAppPool(ne);//建立池
for (int i = 0; i < c ; i++)
if (i < si)
if (chname(kt[i]))//判斷名稱是否存在
movepool(kt[i], AppPoolName, ne);//轉移站點
//if (si < c)
//{
// for (int j = 0; j < si; j++)
// movepool(kt[j], AppPoolName, pls[i]);
//}
//else
// for (int j = 0; j < d; j++)
si = si - c;
#region 池與網站的操作(獲得所有池;獲得指定池的網站名稱;移動網站到新池)
/// 擷取應用程式池->數組
/// <returns></returns>
public static string[] GetApplicationPools()
DirectoryEntry directoryEntry = new DirectoryEntry("IIS://LOCALHOST/W3SVC/AppPools");
if (directoryEntry == null) return null;
List<string> list = new List<string>();
foreach (DirectoryEntry entry2 in directoryEntry.Children)
PropertyCollection properties = entry2.Properties;
list.Add(entry2.Name.ToString().Trim());
return list.ToArray();
/// 獲得所有的應用程式池和對應站點
static void getpoolweb()
DirectoryEntry root = null;
try
root = new DirectoryEntry("IIS://localhost/W3SVC");
catch
return;
foreach (DirectoryEntry website in root.Children)
try
if (website.SchemaClassName != "IIsWebServer") continue;
string comment = website.Properties["ServerComment"][0].ToString();
DirectoryEntry siteVDir = website.Children.Find("Root", "IISWebVirtualDir");
string poolname = "";
try
poolname = siteVDir.Properties["AppPoolId"][0].ToString().Trim();
catch (Exception ex)
Console.WriteLine(ex.Message);
if (poolname == "")
try
poolname = website.Properties["AppPoolId"][0].ToString().Trim();
catch (Exception ex)
Console.WriteLine(ex.Message);
//if (pooln == "") pooln = poolname;
//else pooln += "," + poolname;
//string[] poolns = pooln.Split(',');
foreach (string i in pls)
if (i == poolname)
if (hs[i].ToString() == "")
hs[i] = comment;
else hs[i] += "," + comment;
catch (Exception ex)
Console.WriteLine(ex.Message);
root.Close();
/// 建立池
/// <param name="AppPoolName">應用程式池名稱</param>
public static DirectoryEntry AddAppPool(string AppPoolName)
DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
DirectoryEntry findPool = null;
findPool = appPool.Children.Find(AppPoolName, "IIsApplicationPool");
catch (Exception) { }
if (findPool == null)
findPool = appPool.Children.Add(AppPoolName, "IIsApplicationPool");
findPool.CommitChanges();
appPool.CommitChanges();
//pooln += "," + AppPoolName;
List<string> a = new List<string>();
foreach (string b in pls)
a.Add(b);
a.Add(AppPoolName);
pls = a.ToArray();//添加新池到數組中
WebNums();
boolhs.Add(AppPoolName, "false");
return findPool;
catch (Exception ex)
Console.WriteLine(ex.Message);
return null;
/// 移動網站到新池
/// <param name="webns">網站名稱</param>
/// <param name="poolold">舊池名稱</param>
/// <param name="poolns">新池名稱</param>
static void movepool(string webns,string poolold, string poolns)
DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
foreach (DirectoryEntry website in root.Children)
if (comment == webns)
DirectoryEntry siteVDir = website.Children.Find("Root", "IISWebVirtualDir");
siteVDir.Invoke("Put", new object[2] { "AppPoolId", poolns });
siteVDir.CommitChanges();
website.Invoke("Put", new object[2] { "AppPoolId", poolns });
website.CommitChanges();
for (int i = 0; i < pls.Length; i++)//周遊舊池并修改原數目數組的資料
if (pls[i] == poolold)
nums[i] = (int.Parse(nums[i]) - 1).ToString();
string[] h = hs[poolold].ToString().Split(',');
string hnew = "";
foreach (string s in h)
if (s != webns)
if (hnew == "")
hnew = s;
else hnew += "," + s;
hs[poolold] = hnew;
if (hs[poolns].ToString() == "") hs[poolns] = webns;
else hs[poolns] += "," + webns;
if (pls[i] == poolns)
WebNums();
nums[i] = (int.Parse(nums[i]) + 1).ToString();