标题 | C#程序中操作IIS的应用程序池与站点分配 |
内容 | 一个应用程序池可以有多个站点,一个站点只对应一个应用程序池。 编程由来: 存放在一个应用程序池里的站点过多就不便于操作,所以需把其中一些站点分配到其他程序池中。 编程题目: 用户输入一个数字或者一个数字+一个名字。程序对站点的所在应用程序池进行统计,用户输入的数字用于限制应用程序池里面的最大容量数,如果超出该容量,将把超出的站点分配到其他程序应用池,或者新建的一个应用程序池,把站点分配进去。 如果用户输入一个数字的情况,将遍历所有程序应用池;如果用户输入一个数字+一个名字的情况,将只对该名字的应用程序池进行操作;如果站点的名字和应用程序池的名字一样,将不进行操作。 条件: 一、把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//判断用户输入的数字 { for (int i = 0; i < pls.Length; i++) { 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; } /// <summary> /// 获得池数组对应的网站数量 /// </summary> static void WebNums() { List<string> weblist = new List<string>(); //string[] poolns = pooln.Split(','); foreach (string i in pls) { 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; for (int i = 0; i < pls.Length; i++) { 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++) // movepool(kt[j], AppPoolName, pls[i]); //} } si = si - c; } } } #region 池与网站的操作(获得所有池;获得指定池的网站名称;移动网站到新池) /// <summary> /// 获取应用程序池->数组 /// </summary> /// <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(); } /// <summary> /// 获得所有的应用程序池和对应站点 /// </summary> 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(); } /// <summary> /// 新建池 /// </summary> /// <param name="AppPoolName">应用程序池名称</param> /// <returns></returns> public static DirectoryEntry AddAppPool(string AppPoolName) { try { DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); DirectoryEntry findPool = null; try { 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; } } /// <summary> /// 移动网站到新池 /// </summary> /// <param name="webns">网站名称</param> /// <param name="poolold">旧池名称</param> /// <param name="poolns">新池名称</param> static void movepool(string webns,string poolold, string poolns) { try { DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC"); foreach (DirectoryEntry website in root.Children) { if (website.SchemaClassName != "IIsWebServer") continue; string comment = website.Properties["ServerComment"][0].ToString(); 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(); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } #endregion } |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。