讓我們從一個典型的ASP
NET Web請求的生命周期的起點開始
當用戶輸入一個URL
點擊了一個超鏈接或者提交了一個HTML表單(form)(一個POST請求
相對於前兩者在一般意義上都是GET請求)
或者一個客戶端程序可能調用了一個基於ASP
NET的WebService(同樣由ASP
NET來處理)
在Web服務器端
IIS
或
獲得這個請求
在最底層
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中配置的
當然可以在nfig中覆蓋配置)被配置來將請求路由到指定的HTTP Handler上
每個handler都是一個處理特殊擴展的
NET類
可以從一個簡單的只包含幾行代碼的Hello World類
到非常復雜的handler如ASP
NET的頁面或者WebService的handler
當前
只要了解ASP
NET的映射機制是使用擴展名來從ISAPI接收請求並將其路由到處理這個請求的handler上就可以了
對在IIS中自定義Web請求處理來說
ISAPI是第一個也是最高效的入口
ISAPI連接
ISAPI是底層的非托管Win
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服務管理界面上看到這些映射
如圖
查看網站根目錄的屬性中的主目錄配置頁
然後查看配置|映射
圖
:IIS映射了多種擴展名如
ASPX到ASP
NET的ISAPI擴展
通過這個機制請求會在Web服務器這一層被路由到ASP
NET的處理管道
由於
NET需要它們中的一部分
你不應該設置手動這些擴展名
使用aspnet_regiis
exe這個工具來確保所有的映射都被正確的設置了:
cd <
NetFrameworkDirectory>
aspnet_regiis – i
這個命令將為整個Web站點注冊特定版本的ASP
NET運行時
包括腳本 (擴展名) 映射和客戶端腳本庫(包括進行控件驗證的代碼等)
注意它注冊的是<
Net FrameworkDirectory>中安裝的特定版本的CLR(如
)
aspnet_regiis的選項令您可以對不同的虛擬目錄進行配置
每個版本的
NET框架都有自己不同版本的aspnet_regiis工具
你需要運行對應版本的aspnet_regiis來為web站點或者虛擬目錄來配置指定版本的
NET框架
從ASP
NET
開始提供了ASP
NET配置頁面
可以通過這個頁面在IIS管理控制台來交互的配置
NET版本
做人要厚道
請注明轉自酷網動力(www
ASPCOOL
COM)
From:http://tw.wingwit.com/Article/program/net/201311/12692.html