在IIS中,應用程序與虛擬目錄特別容易混淆,但兩者又是完全不同的概念. 應用程序是一個邏輯邊界,這個邊界可以分隔網站及其組成部分。虛擬目錄則是一個真實的指針,這個指針指向了一個本地或遠程的物理路徑。虛擬目錄總是存在於應用程序之中,一個應用程序可以包括多個虛擬目錄。
1. 應用程序:
一般情況下,一個應用程序就是一個網站(但不是所有情況),而應用程序中如果再創建應用程序,那么它就是這個網站的子應用,比如我們常見的,前台用戶瀏覽功能與后台管理功能,這樣我們可以分成兩個子應用,不過我們也可以通過應用程序框架來實現此功能,而並不一定是依賴於IIS應用程序功能,IIS中應用程序的存在意義大概也就如此了吧。
2. 虛擬目錄:
虛擬目錄的存在意義,我們可以理解為分布式的一種實現手段。說到虛擬目錄,我們有必要引出物理路徑的概念。物理路徑是磁盤上實際存在的路徑,而虛擬目錄是物理路徑的指針,相當於快捷方式。有了虛擬目錄功能,我們就可以將網站的組成部分放在我們想放的任何地方,而不只局限於我們創建網站應用程序的磁盤。
如果沒有虛擬目錄,假如我們在D盤創建了個網站,那么這個網站所有的組成部分,比如圖片,程序代碼,模板文件,有的甚至有視頻文件,這些目錄和文件都只能在D盤的這個網站目錄下,這樣網站應用才可以運行。而有了虛擬目錄功能,我們可以用虛擬目錄指向其它盤符,或者是指向一個網絡路徑,這樣網站的組成部分就不局限於網站應用所在的磁盤,實現了文件分布式存儲,也突破了磁盤容量上限的瓶頸。
在IIS中,應用程序是可以選擇應用程序池的,這說明其是一個獨立的整體,雖然我們有時給應用創建子應用,但它並不依賴父應用,而是獨立的。而虛擬目錄是不可以選擇應用程序池的,這也說明了它是應用程序的組成部分。
3. 例子:
做一個圖片展示類的網站,或者其他需要用戶上傳文件的網站,需要將用戶上傳的文件保存到一個Uploadfiles文件夾下,一般我們在做項目時用戶上傳的文件都是保存在網站項目的同目錄下,而考慮到隨着網站的逐漸運行,這個Uploadfiles文件肯定會越來越大。所以,考慮到這一點,我就想能不能實現將這個Uploadfiles文件夾放在其他的磁盤目錄下,比如網站項目放在服務器C盤下,而Uploadfiles文件夾放在D盤下。
開始考慮用虛擬目錄來實現,但是又擔心項目中在使用該目錄時會出現找不到目錄的問題。后來測試發現需要注意一個地方,就不會報錯了。
網站項目:
Default.aspx頁面用於向虛擬目錄中寫入數據;Web.aspx頁面用於讀取虛擬目錄中的數據。
搭建到IIS中的目錄結構:
Upload文件夾為我創建的虛擬目錄,引用的是其他磁盤下的一個文件夾。
通過高級設置中可以看到:
說明:
這里為了模擬向虛擬目錄中傳入數據,用向文本文檔中寫入數據來測試。
Default.aspx頁面中的代碼:
protected void Page_Load(object sender, EventArgs e) { string path = Server.MapPath("~/Upload/eds.txt"); using (StreamWriter sw=new StreamWriter(path,true)) { Random r = new Random(); sw.Write("我又加了一條 "+r.Next(0,100)+" <br/>"); } Response.Write("ok"); }
Web.aspx頁面中的代碼:
protected void Page_Load(object sender, EventArgs e) { string path = Server.MapPath("~/Upload/eds.txt"); using (StreamReader sr = new StreamReader(path, true)) { Response.Write(sr.ReadToEnd()); } }
運行,數據就會寫入到虛擬目錄中了,和真實目錄效果一樣。
在幾次測試過程中出現了一次錯誤:
這種情況下,將應用程序池由集成模式改為經典模式就能運行了。
測試效果:
寫入數據:
顯示數據: