ASP.NET httpHandler使用淺析
ASP.NET httpHandler使用是如何的呢?來我們先看看討論:先來分析ASP.NET處理一個web請求的過程。學習ASP.NET技術(shù),除了翻看人家的文檔(這是最基本的,知識就是知識,不懂的基本知識無法深入學習),還應(yīng)當自己學會琢磨,動手實習。
當我們從客戶端發(fā)出一個web請求后,到達web服務(wù)器,由web服務(wù)器處理或者轉(zhuǎn)給asp.net框架處理。如果不存在web服務(wù)器(采用asp.net的缺省web處理),那你可以參鄙人的《CASSINI源代碼分析》http://blog.csdn.net/shanhe/archive/2004/11/10/176422.aspx和 《實現(xiàn)自己的ASP.NET宿主系統(tǒng)》http://blog.csdn.net/shanhe/archive/2004/05/27/5429.aspx。
ASP.NET httpHandler使用問題:假設(shè)請求到了ASP.NET的框架,系統(tǒng)回怎么處理呢?
Asp.net系統(tǒng)框架自身有一個http處理的邏輯。這個邏輯由machine.config的 名為httpRuntime的節(jié)指定
- ﹤httpHandlers﹥。。。﹤/httpHandlers﹥
告訴ASP.NET框架一個應(yīng)用程序的http處理程序缺省情況下該如何決定處理邏輯。所謂如何處理是指http 謂詞(Verb)和資源的位置(Path)組合決定的請求的處理。
例如:
- ﹤add
- verb="*"
- path="*.aspx"
- type="System.Web.UI.PageHandlerFactory" /﹥
告訴ASP.NET在處理任何”.aspx”的文件的任何請求(post/get/head/put)時候都應(yīng)該使用System.Web.UI.PageHandlerFactory類處理請求。這個類是系統(tǒng)框架缺省類,遵循System.Web.IhttpHandler接口(但是由MS官方實現(xiàn))。如果你在研究透aspx頁框架后,你可以自己寫一個aspx頁工廠處理程序,簽名后加入全局應(yīng)用程序,再修改此處即可讓aspx頁面沒處理時是按照自己實現(xiàn)的邏輯進行(你甚至可以不遵循頁面控件實現(xiàn)邏輯,雖然那樣并無太大意義)。
我們來做個實驗:我們利用瀏覽器發(fā)出對.config文件的請求(譬如web.config),卻省情況下asp.net會報告錯誤,但是假若我們刪除machine.config中的
- ﹤add
- verb="*"
- path="*.config"
- type="System.Web.HttpForbiddenHandler" /﹥
并保存。重新請求該文件后,那么會看到瀏覽器可以讀取到此文件并可顯示。重新加上該節(jié),重新請求會看到系統(tǒng)報告錯誤。這充分說明了http處理工廠是根據(jù)配置文件進行處理的。據(jù)此類推,我們可以閱讀machine.config的其他相關(guān)配直節(jié),充分理解系統(tǒng)缺省處理邏輯是如何處理web請求(具體為合法的http請求)的。另外,web.config也可以據(jù)此增加/刪除指定http處理程序。參考MSDN,我們發(fā)現(xiàn),任何一個HTTP處理程序?qū)嶋H上是實現(xiàn)了System.Web.IhttpHandler接口的asp.net類。接口應(yīng)當實現(xiàn)一個屬性和一個借口方法:
公共屬性
IsReusable 獲取一個值,該值指示其他請求是否可以使用 IHttpHandler 實例。決定了此處理程序是否可以重用(通??朔靡馕吨到y(tǒng)性能的提高)
公共方法
ProcessRequest 通過實現(xiàn) IHttpHandler 接口的自定義 HttpHandler 啟用 HTTP Web 請求的處理。也就是處理實現(xiàn)。
ASP.NET httpHandler使用問題:假設(shè)我們寫好了一個http處理程序,如何讓他發(fā)揮作用呢?譬如,我們需要禁止asp.net下載.info文件,我們應(yīng)該進行如下處理:
***步,在web服務(wù)器上增加指示,讓asp.net處理此擴展名。具體為:
打開IIS(假設(shè)web服務(wù)器是IIS),找到應(yīng)用程序,配置,應(yīng)用程序映射,添加映射,在可執(zhí)行文件中輸入當前.net版本的aspnet_isapi.dll(如C:\WINNT\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll),擴展名輸入.info,謂詞全部,檢查文件是否存在。經(jīng)過這些步驟,確保IIS不會自作多情處理.info文件,而讓給aspnet_isapi.dll處理,后者則會將請求交給asp.net進行處理。
第二步,在machine.config或者web.config中加入相映配置節(jié)。都是在﹤System.Web〉中的加入﹤httphandler﹥子節(jié),按照格式指定,譬如:
- ﹤httphandlers﹥
- …
- ﹤add verb=”*” path=”*.info” type=” System.Web.HttpForbiddenHandler”﹥
- …
- ﹤/httphandlers﹥
經(jīng)過上述節(jié)配置,.info文件會被保護起來,任何企圖訪問都會被告知“無法提供此類型的頁?!?;如果換成你自己的類,則被asp.net框架所調(diào)用來處理.info請求。
下面來實現(xiàn)一個http處理程序例子,我們增加一個擴展名.img,img文件根據(jù)參數(shù)生成一個圖片,譬如我們向ASP.NET框架請求 abc.img,那么系統(tǒng)返回content為image/jpg格式的圖片,圖片內(nèi)容為abc
源代碼如下:
- using System;
- using System.Web ;
- using System.Drawing;
- using System.Drawing.Drawing2D ;
- using System.Drawing.Imaging ;
- namespace ImyWeb
- {
- public class IMG : System.Web.IHttpHandler
- {
- public IMG()
- {}
- public bool IsReusable
- {
- get{ return true;}
- }
- public void ProcessRequest(HttpContext context)
- {
- string vstr=_getViewString(context);
- context.Response.ContentType ="image/jpeg";
- Image img=new Bitmap(128,128,PixelFormat.Format32bppArgb );
- Graphics g=Graphics.FromImage(img);
- Brush backBrush=new SolidBrush(Color.Gray ); //灰色
- Brush textBrush=new SolidBrush(Color.Black );
- g.FillRectangle(backBrush,0,0,128,128);
- Font ft=new Font( "Arial",32);
- g.DrawString(vstr,ft,textBrush,
- new RectangleF(0,0,128,128),
- new StringFormat(StringFormatFlags.NoWrap ));
- img.Save(context.Response.OutputStream,ImageFormat.Jpeg );
- context.Response .Flush();
- backBrush.Dispose();
- textBrush.Dispose();
- g.Dispose();
- img.Dispose();
- return ;
- }
- //************//
- private string _getViewString(HttpContext context)
- {
- string str= context.Request.RawUrl ;
- int l1=str.LastIndexOf("/");
- int l2=str.LastIndexOf(".");
- return str.Substring(l1+1,l2-l1-1);
- }
- }
- }
編譯后,得到應(yīng)用程序為myHttpHandler.dll。
現(xiàn)在,我們需要告訴ASP.NET應(yīng)用程序(假設(shè)我們的web應(yīng)用程序在localHost/webApp1下),如何處理.img文件了:
***步,在web服務(wù)器上增加指示,讓asp.net處理此.img的擴展名(讓IIS歇著吧,不要插手asp.net的事了,讓asp.net處理*.img了)
第二,在web.config中的﹤system.web﹥節(jié)中增加:
- ﹤httpHndlers﹥
- ﹤add verb="*" path="*.img" type="IBuySpy.IMG,IMGHttphandler" /﹥
- ﹤/httpHndlers﹥
為了能夠讓ASP.NET程序能夠定位到應(yīng)用程序集,將myHttpHandler.dll拷貝到web應(yīng)用程序的bin目錄
接下來,我們測試:在測試的web應(yīng)用程序WebApp1下隨意請求一個.img的資源,將會得到一個jpg圖片。http://localhost/WebApp1/test.img
以上為一個簡單的ASP.NET httpHandler處理程序的設(shè)計、安裝過程。實際上,假設(shè)你對asp.net缺省的*。aspx 的HttpHandler處理不滿,你可以自己進行設(shè)計,替換覆蓋掉machine.config中關(guān)于*.aspx的缺省處理類 "System.Web.UI.PageHandlerFactory”。你要明白,ms設(shè)計了一個服務(wù)框架,而這個框架內(nèi)具有了基本的處理能力,但是優(yōu)秀的是這個框架的部分落及是可以根據(jù)自己的意愿進行替換的(我們看到大量的接口使用,我們應(yīng)當意識到那是使用了大量的現(xiàn)代軟件設(shè)計技術(shù)和思想)。學習asp.net技術(shù)要站在全局來了解框架各個組成部分間如何執(zhí)行、調(diào)用、發(fā)生關(guān)系、縣戶作用,這比實現(xiàn)了一個花哨的datagrid要更有意義。
ASP.NET httpHandler使用簡單的例子就向大家介紹到這里,希望大家能夠了解ASP.NET httpHandler使用基本情況。
【編輯推薦】