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