1. 程式人生 > >通過代碼動態創建IIS站點

通過代碼動態創建IIS站點

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站點