C#操作IIS完整解析
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
最近在為公司實施做了一個工具,Silverlight部署早已是輕車熟路,但對于非技術人員來說卻很是頭疼的一件事,當到現場實施碰到客戶情況也各不相同,急需一個類似系統備份的"一鍵工具"快速實現應用程序部署和數據庫進行關聯。網上關于這方面資源也比較混亂,其中對于IIS的編程影響因素很多,操作技巧上加以細化小結。 A:版本問題 這是你在進行編程前必須要要考慮的一個實際問題,因為IIS版本不同對應編程上基本上完全不同方式來進行的,先了解一下Iss版本在操作系統個具體要求: ISS6.0時代主要以using System.DirectoryServices空間下的 DirectoryEntry 對象作為編程訪問一個主要載體,但隨著ISS7.0發布.NET的Web程序由ISS6.0開始逐漸過渡到 7.0 版本,而且在編程控制ISS上新添加的Microsoft.Web.Administration名稱空間,提出多個用于管理 操作和訪問ISS的對象,使操作ISS的編程更加簡潔高效。 B:我們要做什么 實際用戶操作環境中主要以Windows XP/2000/2003操作系統為主,這就導致了ISS版本主要在5.0/5.1/6.0之間,所以本次演示的代碼編程實例都是ISS7.0版本以下(不包含Iss7.0)。 為了達到演示目的,我們現在需求是這樣的:把硬盤上Silverlight應用程序成功部署到本地機器ISS上,并支持通過局域網訪問,需求很簡單吧,就是一句話,其實當進入實際編程時因為客戶的局域網環境是不可預知的,這也就導致影響部署Silverlight程序到ISS上諸多未知因素,所以要在編程中使Silverlight應用程序部署成功,我們必須利用編程除了控制ISS外還要控制其他主要影響ISS因素。 C:進入編程 既然提出需求我們大概確定一下解決思路: 在默認站點下創建一個虛擬目錄承載Silverlight 應用程序,新建的虛擬目錄運行在獨立應用程序池中,支持本地局域網匿名訪問其實就是對訪問權限控制,為了直接使更改的應用生效需要多次重新啟動ISS的服務,這就需要對ISS服務進行編程控制。 <1>ISS版本的獲取 在進入客戶環境前我們先檢測下是否存在安裝了ISS,以及ISS版本獲取提示,目前獲取ISS版本的方式主要有兩種,第一種方法是通過遍歷DirectoryEntry實體目錄,第二種方式是通過獲取注冊表的ISS修改版本值[經測試這種方式獲取版本不穩定]。 public static void GetIssVersionByDri(string domainname) 通過系統注冊表獲取ISS版本的值[測試發現不穩定]: public static string GetIssVersion() <2>創建虛擬目錄 每個Internet服務可以從多個目錄中發布,通過以通用命名約定 (UNC) 名、用戶名及用于訪問權限的密碼指定目錄,可將每個目錄定位在本地驅動器或網絡上,虛擬目錄可以一個宿主程序,這可發布的操作目錄即為虛擬目錄,再來看看在ISS6.0中創建的虛擬目錄的步驟和控制的屬性。 新建虛擬目錄: /// <summary> DirectoryEntry rootEntry; DirectoryEntry newVirDir; newVirDir.CommitChanges(); newVirDir.Properties["AnonymousPasswordSync"][0] = true; //設置的端口綁定數據 //設置起始默認頁: //_newVirDir 這個方法在創建時主要有兩個參數:一個是新建虛擬目錄名稱,另外一個要部署Silverlight應用程序物理路徑,在獲取根節目錄時需要制定ISS的路徑,ISS的路徑格式。如:IIS://ComputerName/Service/Website/Directory找到根目錄后,添加新建虛擬目錄,制定參數為Schema-指每個結點的類型IIsVirtualDir:——虛擬目錄 IIsWebDir :——普通目錄,添加完成后調用ADSI中的"AppCreate"方法將目錄真正創建,創建完成后通過根目錄和新目錄提交保存。 <3>目錄屬性設置 在DirectoryEntity虛擬目錄屬性可以說是非常多的,當時在編程時我為了區分屬性間區別做了一個方法去遍歷整個屬性集合PropertyCollection,然后把常用重要的屬性跳出來進入賦值設置,因為關于虛擬目錄的屬性在MSDN上的API中并沒有直接提到,特別是對虛擬目錄訪問權限控制非常重要屬性等,先說明局部的常用的屬性: 例如修改程序起始頁: //設置起始默認頁: DefaultDoc選項可以支持多個,但注意選擇性排序,一般修改目錄屬性后都選通過CommitChanges()方法提交保存,但有時你會發現我明明修改屬性,卻沒有保存生效,這是因為ISS中部分屬性設置需要重新啟動ISS服務才能生效,這個時候我們需要對ISS服務進行控制。 <4>ISS服務控制 關于ISS服務控制微軟提供一個命名空間System.ServiceProcess 提供能夠快速操作本地系統服務API,對于ISS服務控制我們最常用的是重新啟動使當前設置生效,在設置服務時我先找到服務名稱,打開計算機管理,在服務和應用程序目錄下打開服務。 我們能看到ISS服務命名是:ISSAdmin 我們通過編碼來控制:啟動ISS。 //獲取IIS Serivcer控制聲明 . 參數為Server在系統標識該服務的簡稱,. 重啟/暫停/停止ISS服務: if (getservicecon.Status == ServiceControllerStatus.Running) 如上就是簡單利用編程有效控制ISS服務運行狀態。 <5>應用程序池創建與控制 ISS應用程序池是將一個或多個應用程序鏈接到一個或多個工作進程集合的配置。因為應用程序池中的應用程序與其他應用程序被工作進程邊界分隔,所以某個應用程序池中的應用程序不會受到其他應用程序池中應用程序所產生的問題的影響,當我們新建一個應用程序時,有時客戶端環境我們無法清除預知,為了盡量減少影響ISS設置外在因素,我們把新建虛擬目錄放到一個獨立應用程序池中。 當創建一個虛擬目錄后,也同時創建一個程序池把虛擬目錄放到其中: /// <summary> 思路如下:首先獲得ISS的根目錄即ISS://localhost/W3SVC,獲取成功后通過SchemaClassName獲取節點類型:ISSWebServer普通目錄、 ISSWebVirturalDir虛擬目錄,通過虛擬目錄的Name唯一名稱獲取指定虛擬目錄,在通過屬性參數AppPoolId設置附屬的應用程序池的名稱,然后提交保存。 其實通過應用我們可以清晰看到ISS中各個目錄之間的關聯關系,上面是修改一個已經存儲在應用程序池,如何創建: public static bool CreateAppPool(string metabasePath, string appPoolName, string Username, string Password) //設置屬性 訪問用戶名和密碼 一般采取默認方式 基本上和創建一個DirectoryEntity雷同,但注意指定的Schome類型是IIsApplicationPool,用來標識創建的是一個應用程序池,當然創建可以刪除,刪除方式如下: DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); 關于應用程序池如果不做任何設置,則在ISS中會被DefaultPool中添加,但有時默認程序池設置環境不一定能夠滿足當前程序需求,例如最常見的關于.NET版本的控制,其中對3.0和3.5版本應用設置需要重新注冊3.5 .NET FrameWork部分組件,這就涉及到一個.NET版本問題。 <6>.NET版本問題 在進行ISS控制中當然也是遇到各種各樣的問題,一方面因為測試XP 2003系統環境不同,需要控制因素過多,當然其中值得一提就是關于整個應用程序池的.NET版本問題,我們先來看看多版本下ISS中設置: 如果我們的應用程序使用3.0或3.5版本,則在應用程序池的沒有對應的.NET版本,這時應用程序運行會提示一個Http錯誤404.17 not Found: 其實ISS在處理應用程序池于.NET版本進行映射時,Net3.0\3.5沒帶處理程序aspnet_isapi.dll,所以IIS中指定網站適用框架時,這也是為什么我們在ISS映射時看不到.Net3.0\3.5版本,最直接的方法重新注冊.NET 3.5 由.NET 2.0版本托管,這時我們需要執行一個Cmd命令: 從新把應用程序池.net版本切換成.net 2.0,同樣實現.net 3.0/3.5托管。 <7>使用環境以及測試條件 如上應用程序和代碼均在Windows 7./XP2/Windows Server 2003上通過,對應的ISS版本范圍從ISS5.0/5.1到Iss 6.0/7.0,包含ISS7.0。篇幅有限,實際中關于ISS的操作還有很多細節問題不能面面俱到,我只是挑了其中我認為基礎或幾位重要幾個問題著重來寫,實際中關于ISS還有其他諸多因素,所以對于這方面控制編程只能折中的有目的性選擇自己想做的效果,切不可貪大求全,因為這本身控制過程就是復雜的過程,客戶環境也不能諸如統一,如有疑問請在留言中回復我。 該文章在 2018/9/8 17:22:23 編輯過 |
關鍵字查詢
相關文章
正在查詢... |