淺談ASP.NET的內部機制(一)
前言:當一個Http請求發送給一個aspx頁面時,伺服器進行了哪些操作?又如何來解析這個請求?ASP.NET在接收請求後是怎麼啟動並執行,如怎麼編譯以及怎麼樣用託管的代碼來啟動並執行?.....理解這些問題,使我們可以更加好的開發ASP.NET。
系列文章連結:
淺談ASP.NET的內部機制(一)
淺談ASP.NET的內部機制(二)
淺談ASP.NET內部機制(三)
淺談ASP.NET內部機制(四)
淺談ASP.NET內部機制(五)
淺談ASP.NET內部機制(六)
淺談ASP.NET內部機制(七)
淺談ASP.NET內部機制(八)
1.當我們在瀏覽器中請求一個ASP.NET網站的某個頁面的時候,如,我們在瀏覽器中輸入"http://localhost/Demo.aspx",這個請求就被發送到了伺服器(當然了,這個網站是部署在IIS中的)。當請求到達了伺服器之後,那麼IIS就開始進行一系列的操作。注意,不是每個請求都一定會由ASP.NET來運行處理的,大家稍後就會明白為什麼。
2.在IIS中有一個組件:http.sys,其實這個組件的作用很簡單,就是驗證請求的url,如之前的"http://localhost/Demo.aspx".如果請求的URL不符合http.sys的要求,那麼這個請求就不會被傳遞給ASP.NET的處理常式,這樣就在IIS這道門檻這些阻止了不合法的url請求,這樣ASP.NET就不用處理這個不合法的請求,就減輕了伺服器的壓力。
下面,我們就來看看這個http.sys到底是怎麼樣處理請求的url的,當大家明白這個問題後,就可以協助我們解決很多的以前遇到的問題。
首先請大家看看下面的圖:
當發送一個請求來請求頁面的時候,http.sys就會檢查這個請求的url和headers的總的大小:包含檢查url中有關查詢字串的大小,如demo.aspx?username=demo,也會檢查cookie的大小。把這些所有的加起來,看看它們是否超過了16KB,如果超過了,請求就失敗了。所以請求根本就沒有傳遞給ASP.NET。
而且在http.sys檢查url的時候也有很多的要求的。如我們之前的那個url:
http://localhost/Demo.aspx
這個url是由localhost,Demo.aspx,這些路徑的片段組成的,每一個由"/"分割的字串都是一個路徑片段,本例中就有兩個路徑片段。在預設情況下,http.sys要求一個url的路徑片段不超過255個,並且每個路徑片段的大小也不要超過260個字母。但是注意,如果在Demo.aspx後面有查詢字串,"Demo.aspx?page=1",那麼這個片段就可以超過260個字母的限制,即"Demo.aspx?page=1"可以更大。但是不管怎麼樣,這些url的大小,如之前所說的,不能超過16KB。如果沒有通過http.sys的要求,IIS就發送一個404的錯誤。
之前也說了的,那是預設的這隻,其實這些設定我們是可以在註冊表中改的。但是預設設定已經很不錯了,所以一般沒有必要改。
3.當請求的url通過了http.sys的檢查後,請求就會傳遞給aspnet_filter.dll,下面簡稱filter。
其實這個filter做兩件事:將url中的無cookie的票據轉換為Http Headers;保護ASP.NET的相應的目錄。
首先來看看第一個作用:檢查url中的無cookie資訊,並且轉換為Http Headers.
大家應該明白ASP.NET2.0中的新特性-支援無cookie,即cookieless。因為我們在進行驗證的時候一般是基於Forms驗證,而這種驗證方式是把資訊儲存在cookie中的,但是有的使用者的瀏覽器是禁用了cookie的,所以為了使得我們可以繼續用這個驗證方式,就把驗證資訊儲存為無cookie,大家可以去查看有關這方面的資料。來看看下面的一個url:
http://localhost/demo/(S(tuucni55xfzj2xqx1mnqdg55))/Default.aspx
我們其實把有關的資訊儲存在了url中,如上面的"S"就標識在後面括弧"()"的資訊就是無cookie的資訊(tuucni55xfzj2xqx1mnqdg55).
來看看“S”是什麼:
S—Cookieless ticket for session state
A—Cookieless ticket for anonymous identification
F—Cookieless ticket for forms authentication
其實filter並不知道這些標識(如"S")的意義.只是filter檢查url中是否包含這些標識,並且這些標識後面還有"()",如果在url中檢查到有這些標識,那麼filter就把這些標識轉換為Http Headers,並且在url中刪除這些標識。我們本來請求的是http://localhost/demo/Default.aspx頁面,但是如果filter不刪除標識,那麼我們請求的http://localhost/demo/(S(tuucni55xfzj2xqx1mnqdg55))/Default.aspx是不存在的,就會返回一個404錯誤(找不到請求的檔案)。
現在我們來看看filter的第二個作用的:保護ASP.NET的相應的目錄。
在我們開發的ASP.MET網站中,有很多的檔案目錄是不允許訪問的,如我們存放資料的App_Data,App_Code等。所以filter就會檢查請求的url中是否包含這樣的字元,如http://localhost/demo/App_Code/....一旦發現有這樣的字串出現,甚至是以"App_"開發的任何字串,如“App_MyFolder",這個請求就會被拒絕了。但是,假如你的項目中已經有一個這樣的以"App_"命名的目錄,如果你非要可以訪問這樣的目錄,可以在註冊表中修改設定HKEY_LOCAL_MACHINE\Software\Microsoft\ASP.NET。
今天就寫到這些,下篇接著講述。