我爲什麼要寫這一系列呢,因爲只有瞭解運行機制,學好底層,對我們更深入的理解一定的問題有幫助。
一:ASP.NET的工作原理
我們根據下面這張圖來說明ASP.NET是如何來工作的
1.1 客戶請求Web頁
我們知道ASP.NET是B/S結構,也就是服務器和瀏覽器這樣一個結構,服務器可以有一臺或者多臺,對於瀏覽器可以有無數個,每個客戶是通過瀏覽器來訪問服務器的,所以第一步是客戶請求Web頁。
1.2 Web服務器尋找指令文件
於是這個指令就通過瀏覽器被髮送到服務器上比如:http://www.menglin/test.apx,在服務器上開始尋找指令文件,在我們這裏是尋找.aspx文件,如果服務器上沒有裝.Framework,對於.aspx文件服務器就不知道如何處理了。如果服務器已經裝了.Framework,就會找這個指令。
1.3 ASP.NET代碼發送給公共語言運行時進行編譯
這個指令是誰來處理的呢?是aspnet_isapi.dll這個動態鏈接庫來處理的,可以說在ASP.NET中所有的.aspx文件都是被aspnet_isapi.dll它來處理的,它的作用就是把.aspx文件發送給公共語言運行時進行編譯,也就是發送給.Framework裏面的公共語言運行時CLR進行編譯。
1.4 HTML流返回給瀏覽器
編譯完了以後,把HTML流返回給瀏覽器。
1.5 瀏覽器處理HTML流並顯示頁面
瀏覽器解釋HTML流,並顯示頁面。
可以看出Web服務器處理的過程就是調用aspnet_isapi.dll處理aspx文件的過程,處理的結果就是一個HTML靜態頁面。
二:ASP.NET頁面的執行流程
2.1 每個.aspx文件實際上是繼承page類的,在運行的過程中它從一個類變成了一個對象,這是一個實例化的過程。
2.2 把類轉化爲一個對象以後呢,被CLR轉化爲HTML,發送給aspnet_iaapi.dll。
2.3 aspnet_iaapi.dll然後和IIS交互,把HTML發送給IIS。
2.4 IIS把HTML返回給瀏覽器。
三:ISAPI
我們前面好幾次講到aspnet_iaapi.dll,到底aspnet_iaapi.dll是個什麼東西呢?
在互聯網開始時候,基本上Intent都是靜態頁面,靜態頁面是以.HTML文件爲代表的,但是隨着需求的發展,靜態頁面已經滿足不了需求了,這時候開發者就需要擴展Web服務器的功能,這時候不同的Web服務器廠商都遵循了同一個主題“向Web服務器插入某些組件”,也就是說這在極大程度上豐富了Web服務器,對於Web服務器來說它可以進行功能的擴充,是通過加組件的方式,調用組件來實現一些功能的。所有的Web服務器都允許開發者自己來插入一些組件來增強Web服務器的功能,微軟提出了ISAPI(全稱是Intent Server API),所以到這裏明白了,提供了一種技術,這種技術讓開發者向Web服務器插入一些組件來擴充Web服務器的功能。
ISASP經常用兩個手段實現。
3.1 ISAPI擴展
ISAPI擴展是使用Win32動態鏈接庫來實現的,我們之前提到的aspnet_iaapi.dll就是這種方式,這種擴展是通過dll來實現的。
3.2 ISAPI過濾器
客戶端每次向服務器發送請求都要經過濾器的,客戶端不需要在請求中指定過濾器,只需要把請求發送給Web服務器,Web服務器把請求傳遞給相關的過濾器,過濾器可能修改請求,執行某些操作。
四:ASP.NET請求的處理過程
ASP.NET請求的處理過程是基於管道模型的,在模型中ASP.NET把HTTP請求傳遞給管道中的所有模塊,每個模塊都接收HTTP請求並擁有完全控制權,模塊可以用自認爲合適的方式來處理請求,一旦HTTP請求經過所有HTTP模塊,最終被HTTP處理程序所處理,HTTP處理程序隊請求做一些處理,並且結果將再次經過管道中的HTTP模塊。類似一個管道似的。