ASP.NET專案在IIS上使用虛擬目錄
在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()); } }
執行,資料就會寫入到虛擬目錄中了,和真實目錄效果一樣。
在幾次測試過程中出現了一次錯誤:
這種情況下,將應用程式池由整合模式改為經典模式就能運行了。
測試效果:
寫入資料:
顯示資料: