通過代碼動態創建IIS站點
阿新 • • 發佈:2018-04-01
UC times 腳本 工作 led pan serve default turn
對WebApi進行單元測試時,一般需要一個IIS站點,一般的做法,是通過寫一個批處理的bat腳本來實現,其實通過編碼,也能實現該功能。
主要有關註三點:應用程序池、Web站點、綁定(協議類型:http、https,IP地址,端口,主機名)
1.總體代碼
var webSite = app.WebSite; using (var sm = new ServerManager()) { //創建應用程序池 var appPool = sm.ApplicationPools.FirstOrDefault(ap => ap.Name.Equals(webSite.PoolName)); if (appPool == null) { CreateAppPool(sm.ApplicationPools, webSite.PoolName); } //創建Web站點 var site = sm.Sites.FirstOrDefault(s => s.Name.Equals(webSite.SiteName)); if (site == null) { CreateWebSite(sm.Sites, webSite, app.InstallPath); } sm.CommitChanges(); }
2.創建應用程序池:
/// <summary> /// 創建應用程序池 /// </summary> /// <param name="appPools"></param> /// <param name="appPoolName"></param> private void CreateAppPool(ApplicationPoolCollection appPools, string appPoolName) { var appPool = appPools.Add(appPoolName); //是否自啟動 appPool.AutoStart = true; //隊列長度 appPool.QueueLength = 10000; //啟動模式 appPool.StartMode = StartMode.AlwaysRunning; //回收時間間隔 appPool.Recycling.PeriodicRestart.Time = new TimeSpan(); //閑置超時 appPool.ProcessModel.IdleTimeout = new TimeSpan(); //最大工作進程數 appPool.ProcessModel.MaxProcesses = 1; }
3.創建站點
/// <summary> /// 創建Web站點 /// </summary> /// <param name="sites"></param> /// <param name="webSite"></param> /// <param name="physicalPath"></param> private void CreateWebSite(SiteCollection sites, WebSite webSite, string physicalPath) { Site site = null; bool isSiteCreated = false; foreach (var binding in webSite.Bindings) { var bingdingInfo = ConstructBindingInfo(binding); if (!isSiteCreated) { site = sites.Add(webSite.SiteName, binding.BindingType, bingdingInfo, physicalPath); //是否自啟動 site.ServerAutoStart = true; isSiteCreated = true; } else { site.Bindings.Add(bingdingInfo, binding.BindingType); } } var root = site.Applications["/"]; //設置應用程序池 root.ApplicationPoolName = webSite.PoolName; //設置虛擬目錄 // root.VirtualDirectories["/"].PhysicalPath = pathToRoot; //預加載 root.SetAttributeValue("preloadEnabled", true); }
4.創建綁定
/// <summary> /// 構建綁定信息 /// </summary> /// <param name="binding"></param> /// <returns></returns> private string ConstructBindingInfo(WebSiteBinding binding) { var sb = new StringBuilder(); if (!string.IsNullOrEmpty(binding.IP)) { sb.Append(binding.IP); } else { sb.Append("*"); } sb.Append(":"); sb.Append(binding.Port); sb.Append(":"); if (!string.IsNullOrEmpty(binding.HostName)) { sb.Append(binding.HostName); } else { sb.Append(string.Empty); } return sb.ToString(); }
通過代碼動態創建IIS站點