ASP.NET底層架構之從瀏覽器到ASP.NET

來源:互聯網
上載者:User
asp.net|架構|瀏覽器   讓我們從一個典型的ASP.NET Web請求的生命週期的起點開始。當使用者輸入一個URL,點擊了一個超連結或者提交了一個HTML表單(form)(一個POST請求,相對於前兩者在一般意義上都是GET請求)。或者一個用戶端程式可能調用了一個基於ASP.NET的WebService(同樣由ASP.NET來處理)。在Web伺服器端,IIS5或6,獲得這個請求。在最底層,ASP.NET和IIS通過ISAPI擴充進行互動。在ASP.NET環境中這個請求通常被路由到一個副檔名為.aspx的頁面上,但是這個流程是怎麼工作的完全依賴於處理特定副檔名的HTTP Handler是怎麼實現的。在IIS中。aspx通過’應用程式擴充’(又稱為指令碼映射)被映射到ASP.NET的ISAPI擴充DLL-aspnet_isapi.dll。每一個請求都需要通過一個被註冊到aspnet_isapi.dll的副檔名來觸發ASP.NET(來處理這個請求)。

  依賴於副檔名ASP.NET將請求路由到一個合適的處理器(handler)上,這個處理器負責擷取這個請求。例如,WebService的。asmx副檔名不會將請求路由到磁碟上的一個頁面,而是一個由特殊屬性(Attribute)標記為WebService的類上。許多其他處理器和ASP.NET安裝,當然你也可以自訂處理器。所有這些HttpHandler在IIS中被配置為指向ASP.NET ISAPI擴充,並在web。config(譯著:ASP.NET中內建的handler是在machine。config中配置的,當然可以在web.config中覆蓋配置)被配置來將請求路由到指定的HTTP Handler上。每個handler都是一個處理特殊擴充的。NET類,可以從一個簡單的只包含幾行代碼的Hello World類,到非常複雜的handler如ASP.NET的頁面或者WebService的handler。當前,只要瞭解ASP.NET的映射機制是使用副檔名來從ISAPI接收請求並將其路由到處理這個請求的handler上就可以了。

  對在IIS中自訂Web請求處理來說,ISAPI是第一個也是最高效的入口。

  ISAPI串連

  ISAPI是底層的非託管Win32 API。ISAPI定義的介面非常簡單並且是為效能做了最佳化的。它們是非常底層的-處理指標和函數指標表來進行回調-但是它們提供了最底層和面向效率的介面,使開發人員和工具供應商可以用它來掛接到IIS上。因為ISAPI非常底層所以它並不適合來開發應用級的代碼,而且ISAPI傾向於主要被用於橋接介面,向上層工具提供應用伺服器類型的功能。例如,ASP和ASP.NET都是建立在ISAPI上的,Cold Fusion,運行在IIS上的多數Perl,PHP以及JSP實現,很多第三方解決方案(如我的Wisual FoxPro的Web串連架構)都是如此。ISAPI是一個傑出的工具,可以為上層應用提供高效的管道介面,這樣上層應用可以抽象出ISAPI提供的資訊。在ASP和ASP.NET中,將ISAPI介面提供的資訊抽象成了類型Request和Response這樣的對象,通過它們來讀取ISAPI請求中對應的資訊。將ISAPI想像成管道。對ASP.NET來說,ISAPI dll是非常的”瘦”的,只是作為一個路由機制來將原始的請求轉寄到ASP.NET運行時。所有那些沉重的負擔和處理,甚至請求線程的管理都發生在ASP.NET引擎內部和你的代碼中。

  作為最為協議,ISAPI同時支援ISAPI擴充和ISAPI過濾器(Filter)。擴充是一個請求處理介面,提供了處理Web伺服器的輸入輸出的邏輯-它本質上是一個處理(事物?)介面。ASP和ASP.NET都被實現為ISAPI擴充。ISAPI過濾器是掛接介面,提供了查看進入IIS的每一個請求的能力,並能修改請求的內容或者改變功能型的行為,例如認證等。順便提一下,ASP.NET通過了兩種概念映射了類似ISAPI的功能:Http Handler類似擴充,Http Module類似過濾器。我們將在後面詳細討論它們。

  ISAPI是開始一個ASP.NET請求的最初的入口。ASP.NET映射了好幾個副檔名到它的ISAPI擴充,此擴充位於。NET架構的目錄下:

  <.NET FrameworkDir>\aspnet_isapi.dll

  你可以在IIS服務管理介面上看到這些映射,如圖1。查看網站根目錄的屬性中的主目錄配置頁,然後查看配置|映射。

  

  圖1:IIS映射了多種副檔名如。ASPX到ASP.NET的ISAPI擴充。通過這個機制請求會在Web伺服器這一層被路由到ASP.NET的處理管道。

  由於.NET需要它們中的一部分,你不應該設定手動這些副檔名。使用aspnet_regiis.exe這個工具來確保所有的映射都被正確的設定了:

  cd <.NetFrameworkDirectory>

  aspnet_regiis – i

  這個命令將為整個Web網站註冊特定版本的ASP.NET運行時,包括指令碼 (副檔名) 映射和用戶端指令碼庫(包括進行控制項驗證的代碼等)。注意它註冊的是<.Net FrameworkDirectory>中安裝的特定版本的CLR(如1.1,2.0)。aspnet_regiis的選項令您可以對不同的虛擬目錄進行配置。每個版本的.NET架構都有自己不同版本的aspnet_regiis工具,你需要運行對應版本的aspnet_regiis來為web網站或者虛擬目錄來配置指定版本的。NET架構。從ASP.NET2.0開始提供了ASP.NET配置頁面,可以通過這個頁面在IIS管理主控台來互動的配置.NET版本。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.