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