之前由于工作需要自己做一個一鍵部署的小工具,實現三個模塊的功能:TFS操作創建映射并獲取最新源代碼;SQL Server數據庫注冊表配置數據庫連接;IIS站點部署,生成可訪問的IIS站點。由于是基于自己的工作環境下的開發,所以在TFS和SQL Server配置工具化實現,有一些點是默認按照公司的環境配置參數默認的,雖然不是廣泛適用每一種情況的環境部署,但是在學習這三個模塊的開發過程中,還是有很多東西是可以值得分享的。
今天先分享一下,如何通過工具化實現IIS站點部署和配置,為了可復用性,IIS操作這次是將其封裝成一個類,以方便調用。
可以看一下工具的截圖:由于這個只是為了節省開發部署環境的時間而開發的小工具,所以沒那么高大上,還請各位看官包涵。

進入正題:先從使用角度來講解IIS操作,然后再深入到具體的IIS服務底層原理。
【1】前提掌握要點:
(1)、IIS到目前經歷了四個版本分別為 IIS4.0 IIS5.0 IIS6.0 IIS7.0,其中IIS6.0 IIS7.0是在5.0的安全問題的基礎上獲得的發展,目前為止。6.0版本以后的都是比較安全穩定的,為什么需要了解IIS版本,是因為6.0以后和之前的IIS提供的操作API是不一樣的,不過IIS6.0時代主要以using System.DirectoryServices空間下的DirectoryEntry 對象作為編程訪問一個主要載體.但隨著IIS7.0發布.NET的Web程序由IIS6.0開始逐漸過渡到 7.0版本.而且在編程控制IIS上新添加的Microsoft.Web.Administration名稱空間, 可以操作7.0
(2)、平時的站點部署需要配置什么參數或者說是我們一般自己部署站點需要什么場景的操作,考慮可以用程序實現的,然后可以模型化為對象去實現。
我采用的方案是:將部署的站點聲明為一個對象,其中包含了一般我們站點部署時設置的參數作為它的屬性和字段,將我們一般站點設置實現為一些方法。
可以先定義一個站點類:
//站點身份驗證模式 public enum autherRight {asp.net模擬, Form身份驗證, Windows身份驗證, 基本身份驗證,匿名身份驗證,摘要式身份驗證 }; /// <summary> /// 站點類 /// </summary> public class newWebSiteInfo { //站點設置參數 public string hostip; //主機ip public string porNum; //端口號 public string hostName;//主機名 public string webName; //網站名 public string appName; //應用程序池 public string webPath; //根目錄 public string visualPath;//虛擬目錄 public Dictionary<string, string> newMimeType;//需要新添加mime類型 public autherRight autherRight;//身份驗證模式 public string defoultPage;//默認文檔 public newWebSiteInfo(string hostip, string portnum, string hostname, string webname, string appName, string webpath, string visualPath, Dictionary<string, string> newMimeType, autherRight autherRight,string defoultPage) { this.hostIp = hostip; this.porNum = portnum; this.hostName = hostname; this.webName=webname; this.appName = appName; this.webPath = webpath; this.visualPath = visualPath; this.newMimeType = newMimeType; this.autherRight = autherRight; this.defoultPage = defoultPage; } /// <summary> /// 返回站點綁定信息 /// </summary> /// <returns></returns> public string bindString() { return String.IsNullOrEmpty(hostName) ? String.Format("http://{0}:{1}", hostIp, porNum) : String.Format("http://{0}:{1}", hostName, porNum); } }目前IIS操作主要有兩種方式:一種是System.DirectoryServices空間下面的類,用于IIS5/6版本,和可以兼容iis6的IIS7版本;Microsoft.Web.Administration空間下面的類,IIS7引入的新的管理類,主要通過ServerManger類進行站點新增。
本次主要通過System.DirectoryServices方式操作IIS,也簡要介紹一下ServerManger新建站點:
(1) 添加.net引用Microsoft.Web.Administration.dll,實例化ServerManger新增站點方式如下:
using System;using Microsoft.Web.Administration;class CreateASite{ static void Main(string[] args) { ServerManager serverManager = new ServerManager(); Site mySite = serverManager.Sites.Add( "MySite", "d://inetpub//mysite", 8080); mySite.ServerAutoStart = true; serverManager.CommitChanges(); }}(2)通過System.DirectoryServices空間下面的類獲取IIS服務,但其實對于高版本的也可以同時引用Microsoft.Web.Administration.dll中通過ServerManger來進行參數設置各有各的好處。
首先介紹一下我用到的幾個命名空間:
using System.DirectoryServices; //獲取目錄實體類using Microsoft.Web.Administration; //ServerManger類所屬命名空間using IISOle; //IIS管理添加mime類型using System.Security.accessControl; //設置文件安全權限類所屬命名空間using System.IO; //文件路徑類所屬命名空間using System.ServicePRocess; //上一節中所用的系統服務對象所屬命名空間
現在提供我自己的源代碼,可以適用一般類需求,對于一些特殊配置的應用程序部署,可以稍微做微調。
///created by george///date:2014-5-3///QQ:709617880namespace IISmng{ //站點身份驗證模式 public enum autherRight {asp_net模擬, Form身份驗證, Windows身份驗證, 基本身份驗證,匿名身份驗證,摘要式身份驗證 }; /// <summary> /// 站點類 /// </summary> public class newWebSiteInfo { //站點設置參數 public string hostIp; //主機ip public string porNum; //端口號 public string hostName;//主機名 public string webName; //網站名 public string appName; //應用程序池 public string webPath; //物理路徑 public string visualPath;//虛擬目錄 public Dictionary<string, string> newMimeType;//需要新添加mime類型 public autherRight autherRight;//身份驗證模式 public string defoultPage;//默認文檔 public newWebSiteInfo(string hostip, string portnum, string hostname, string webname, string appName, string webpath, string visualPath, Dictionary<string, string> newMimeType, autherRight autherRight,string defoultPage) { this.hostIp = hostip; this.porNum = portnum; this.hostName = hostname; this.webName=webname; this.appName = appName; this.webPath = webpath; this.visualPath = visualPath; this.newMimeType = newMimeType; this.autherRight = autherRight; this.defoultPage = defoultPage; } /// <summary> /// 返回站點綁定信息 /// </summary> /// <returns></returns> public string bindString() { return String.IsNullOrEmpty(hostName) ? String.Format("http://{0}:{1}", hostIp, porNum) : String.Format("http://{0}:{1}", hostName, porNum); } } //托管模式 public enum modelType{集成,經典}; //net版本 public enum netVersion{ v2_0 , v4_0}; /// <summary> /// IIS操作類 /// </summary> public class myIIS { /// <summary> /// IIS版本屬性 /// </summary> public String IISVersion { get { return IISVersion; } set{ DirectoryEntry IISService = new DirectoryEntry("IIS://localhost/W3SVC/INFO"); IISVersion = "v"+IISService.Properties["MajorIISVersionNumber"].Value.ToString(); } } /// <summary> /// 檢測客戶端或服務器是否安裝IIS服務 /// </summary> /// <returns>true OR false</returns> public Boolean checkIIS() { Boolean retMsg = false; try { DirectoryEntry IISService = new DirectoryEntry("IIS://localhost/W3SVC"); if(IISService.GetType().ToString().Equals("DirectoryEntry")) { if (checkServiceIsRunning("IIS Admin Service")) retMsg=true; } } catch(Exception e){ } return retMsg; } /// <summary> /// 檢測服務是否開啟 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public Boolean checkServiceIsRunning(string serviceName) { ServiceController[] allServices = System.ServiceProcess.ServiceController.GetServices(); Boolean runing = false; foreach (ServiceController sc in allServices) { if (sc.DisplayName.Trim() == serviceName.Trim()) { if (sc.Status.ToString() == "Running") { runing = true; } } } return runing; } /// <summary> /// 獲取本機IIS版本 /// </summary> /// <returns></returns> public String getIISVersion() { String retStr = ""; if (checkIIS()) { DirectoryEntry IISService = new DirectoryEntry("IIS://localhost/W3SVC/INFO"); retStr = "v"+IISService.Properties["MajorIISVersionNumber"].Value.ToString(); } return retStr; } /// <summary> /// 判斷程序池是否存在 /// </summary> /// <param name="AppPoolName">程序池名稱</param> /// <returns>true存在 false不存在</returns> private bool i
新聞熱點
疑難解答