將編譯的dll檔案拷貝到web項目的bin目錄下,在web項目的web.config檔案system.web節點中配置:
這樣就將自訂的HttpModule類MyHttpModule插入到了當前web的HttpModule的Pipeline中。 HttpModule主要功能是對Application的各個事件進行截取,在這些事件中完成自己的處理。其實如果自己開發一些項目,直接在 Global.asax中處理已經足夠了。如果是開發一個Framework或者是某些方面的組件,需要在事件中添加處理,開發自訂的 HttpModule,可以避免使用Framework或者組件時,還得手工在Global.asax中添加代碼。 目前想到的開發自訂HttpModule的用途,有全域的身份/許可權驗證、自訂網站訪問/動作記錄的記錄、處於管理/調試等目的對網站進行監控追蹤 等。當然,如果是結合自訂的HttpHandler進行Framework的開發,HttpModule可以用於其它的一些特殊的處理。
<httpModules> <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/> </httpModules> |
注意要區分大小寫,因為web.config作為一個XML檔案是大小寫敏感的。“type=MyHttpModuleTest.MyHttpModule,MyHttpModule”告訴我們
系統將會將http request請求交給位於MyHttpModule.dll檔案中的MyHttpModuleTest.MyHttpModule類去處理。
HttpHandler是完全的對Http Request的截取。
首先,繼承System.Web.IHttpHandler介面,實現自己的HttpHandler類。必須要實現介面的ProcessRequest方 法和IsReusable屬性。ProcessRequest方法中完成對每個Http Request的處理,發送處理結果的HTML到輸出緩衝中。IsReusable屬性被.Net Framework調用,用以確定這個HttpHandler的執行個體是否可以被重用於同類型其它的Request處理。
如果你在自己的HttpHandler類中,需要讀取或者是寫Session值,需要再繼承一個介面IRequiresSessionState。這個接 口沒有任何方法,只是一個標記介面。繼承這個介面之後,就可以在自己的HttpHandler中訪問Session,可以在Session中寫入值。
namespace MyHandler{public class MyHttpHandler : IHttpHandler, IRequiresSessionState{public MyHttpHandler() {}public bool IsReusable{ get { return true; }}public void ProcessRequest(HttpContext context){ HttpResponse objResponse = context.Response ; objResponse.Write(" This request is handled by MyHttpHandler");}}} |
把編譯的dll檔案拷貝到web項目的bin目錄下。
接下來,這樣來測試一下MyHttpHandler。我們為IIS配置一個以.cc為尾碼名的檔案類型,用我們寫的MyHttpHandler來處理。
首先,在IIS網站的Configuration配置裡面,添加一個對.cc尾碼名處理的Application Extention Mapping項。
然後,在web項目的web.config節點節點中配置:
MyHttpHandler, MyHandler"/>
verb屬性配置這個HttpHandler處理那些HTTP方法,例如GET、POST等,如果是處理所有方法,就用*。path屬性配置HttpHandler對哪些檔案進行處理,例如可以是myfile.cc,如果是處理所有的.cc檔案,就用*.cc。
這樣,這個網站上所有.cc類型檔案的訪問,都由MyHttpHandler處理。使用http://localhost/網站虛擬目錄/a.cc訪問測試網站,可以看到測試效果。當然,a.cc這個檔案在Web伺服器上是並不存在的。
對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的緩衝中進行輸出。
總體來說,Maverick的架構架構概念很不錯,但也存在明顯的缺陷,以後有時間再詳細的寫寫它的架構和需要改進之處。
總之,將HttpModule、HttpHandler,以及使用Ajax等將用戶端進行封裝結合起來,能夠給web項目的開發帶來非常大的改善空間。
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+"); //用Regex進行匹配 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裡面加上如下語句:
<httpHandlers><add verb="*" path="*.shtml" type="HttpHandle.UrlRewrite" /></httpHandlers> |
同時,還要在IIS中對Web項目進行配置,在Web項目的屬性中,在主目錄選項卡裡,把執行許可權改為"指令碼和可執行檔",然後開啟配置,在應用程式擴充裡加上需重寫的檔案格式的擴充,好了,成事具備,只欠運行了。