IHttpModule與IHttpHandler的區別(續)
1.先後次序.先IHttpModule,後IHttpHandler. 注:Module要看你響應了哪個事件,一些事件是在Handler之前執行的,一些是在Handler之後執行的HttpModule主要功能是對Application的各個事件進行擷取,在這些事件中完成自己的處理。其實如果自己開發一些專案,直接在 Global.asax中處理已經足夠了。如果是開發一個Framework或者是某些方面的元件,需要在事件中新增處理,開發自定義的 HttpModule,可以避免使用Framework或者元件時,還得手工在Global.asax中新增程式碼。 目前想到的開發自定義HttpModule的用途,有全域性的身份/許可權驗證、自定義網站訪問/操作日誌的記錄、處於管理/除錯等目的對站點進行監控追蹤 等。當然,如果是結合自定義的HttpHandler進行Framework的開發,HttpModule可以用於其它的一些特殊的處理。
2.對請求的處理上:
IHttpModule是屬於大小通吃型別,無論客戶端請求的是什麼檔案,都會呼叫到它;例如aspx,rar,html的請求.
IHttpHandler則屬於挑食型別,只有ASP.net註冊過的檔案型別(例如aspx,asmx等等)才會輪到呼叫它.
3.IHttpHandler按照你的請求 生成響應的內容,IHttpModule對請求進行預處理,如驗證、修改、過濾等等,同時也可以對響應進行處理
對HttpHandler的使用,比較典型的有.Net的Web MVC開源專案Maverick。Maverick使用一個Dispatcher類對所有的Http Request進行擷取,他以.m作為字尾名向Web伺服器提交請求,在Dispatcher中,將.m的字尾去掉,提取Command Name,然後以這個command name從配置檔案中載入處理的flow,形成一個chain,依次對chain上的各個command和view進行處理,對各個command和 view的處理結果可能會在chain中選擇不同的處理分支,每個處理的Step中將處理結果的HTML寫入Response的快取中進行輸出。
Asp.Net HttpHandler實現URL重寫的
我們經常看到很多網站訪問文章的時候才用的是***.html 或***.shtml (如本blog的日誌訪問效果),其時這寫檔案在伺服器上不存在的,那為什麼會出現這樣的效果呢,是因為Web伺服器上對URL執行了重寫,把訪問的 URL根據特定的格式重寫成內部訪問頁面來實現的,它的好處是便於使用者理解,同時搜尋引擎也能更好地收入你的網站,當然其它的好處也很多,這裡不做一一介 紹了。
本文所講的是使用Asp.Net中的HttpHandler實現URL重寫的,它所實現的原理請看這裡,本程式可以處理任何Url,因為我在程式中使用了URL過慮,只有訪問檔名是數字的才進行處理,並指在內部執行一個新的頁面,並輸出資料,程式碼如下:
public void ProcessRequest(HttpContext Context)
{
try {
//申明Request
HttpRequest Request = Context.Request;
//取來路Url的絕對路徑
string Url = Request.Url.AbsolutePath;
//取訪問的Web檔案的開始字元間隔數
int RegStart = Url.LastIndexOf("/") + 1;
//申明一個確定Web檔名是否全是數字
Regex Reg = new Regex(@"/d+");
//用正規表示式進行匹配
if (Reg.IsMatch(Url, RegStart))
{
// 如果web檔名是數字,則判定是查詢相關文章,
執行指定頁面 Context.Server.Execute
("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value);
}
}
catch
{
Context.Response.Redirect(Context.Request.Url.ToString());
}
}
當然你首先要做的是先建一個類,並繼承自IHttpHandler,然後把這段程式碼拷入,並編譯。在Web專案中若要使用此功能,需要在web.config裡面加上如下語句:
同時,還要在IIS中對Web專案進行配置,在Web專案的屬性中,在主目錄選項卡里,把執行許可權改為"指令碼和可執行檔案",然後開啟配置,在應用程式擴充套件里加上需重寫的檔案格式的擴充套件
因為web.config作為一個XML檔案是大小寫敏感的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28699126/viewspace-757538/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- IHttpModule和IHttpHandler 應用筆記HTTP筆記
- IHttpModule介面HTTP
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 淺談IHttpHandlerHTTP
- ??與?:的區別
- 談談持續整合,持續交付,持續部署之間的區別
- MySQL的@與@@區別MySql
- mybatis #與$的區別MyBatis
- Null 與 “” 的區別Null
- &與&&, |與||區別
- in與exist , not in與not exist 的區別
- .net開發筆記(十二) 設計時與執行時的區別(續)筆記
- CentOS 與 Ubuntu 的區別CentOSUbuntu
- artice與section的區別
- GET 與 POST 的區別
- WebSocket 與 Socket 的區別Web
- Postgresql與MySQL的區別MySql
- chown與chmod的區別
- LESS與SASS的區別
- free 與 CFRelease 的區別
- gulp與webpack的區別Web
- @Autowired 與@Resource的區別
- let與var的區別
- post與get的區別
- HashSet與HashMap的區別HashMap
- maven與ant的區別Maven
- __new()__ 與 __init()__的區別
- TCP與UDP的區別TCPUDP
- Mysql與mongodb的區別MySqlMongoDB
- typedef與define的區別
- Eureka與Zookeeper的區別
- buffer與cache的區別
- async與defer的區別
- synchronized與Lock的區別synchronized
- kill與pkill的區別
- int與Integer的區別
- HTML與XHTML的區別HTML
- mysql與Oracle的區別MySqlOracle