ASP.NET的HTTP模塊和處理程序之處理程序的執(zhí)行
ASP.NET運(yùn)行時對HTTP處理程序的使用方式
無論你是否相信,ASP.NET都使用HTTP請求實(shí)現(xiàn)了大量的自己的功能。ASP.NET使用處理程序來處理.aspx、.asmx、.soap和其它ASP.NET文件。
下面是machine.config文件中的一個片段:
- <httpHandlers>
- <add verb="*" path="trace.axd" type="System.Web.Handlers.TraceHandler"/>
- <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
- <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
- <add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/>
- <add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>
- . . . . . .
- . . . . . .
- </httpHandlers>
在上面的配置信息中你可以看到對.aspx文件的所有請求都由System.Web.UI.PageHandlerFactory類來處理。與此類似,對.config文件和其它文件(它們不能被客戶端直接訪問)的所有請求都由System.Web.HttpForbiddenHandler類處理。你可能已經(jīng)猜到,當(dāng)訪問這些文件的時候,該類簡單地給客戶端返回一個錯誤信息。
執(zhí)行HTTP處理程序
現(xiàn)在你將看到如何實(shí)現(xiàn)一個HTTP處理程序。那么我們的新處理程序要做什么任務(wù)呢?前面我提到,處理程序大多數(shù)用于給Web服務(wù)器添加新功能;因此,我將建立一個處理程序來處理新的文件類型——擴(kuò)展名為.15seconds的文件。我們建立了這個處理程序并在我們的Web應(yīng)用程序的web.config文件中注冊之后,所有對.15seconds文件的請求都將由這個新處理程序來處理。
你可能正在考慮這個處理程序的使用方法。如果你希望引入一種新的服務(wù)器腳本語言或動態(tài)服務(wù)器文件(例如asp、aspx)該怎么辦呢?你可以為它編寫一個自己的處理程序。類似地,如果你希望在IIS上運(yùn)行Java小程序、JSP和其它一些服務(wù)器端Java組件應(yīng)該怎么辦呢?一種方法是安裝某些ISAPI擴(kuò)展(例如Allaire或Macromedia Jrun)。你也可以編寫自己的HTTP處理程序。盡管這對于第三方廠商(例如Allaire和Macromedia)來說是很復(fù)雜的事務(wù),但是它卻是個很有吸引力的選擇,因?yàn)樗鼈兊腍TTP處理能夠能夠訪問ASP.NET運(yùn)行時暴露的所有新功能。
實(shí)現(xiàn)我們的HTTP處理程序包含以下步驟:
1.編寫一個實(shí)現(xiàn)IHttpHandler接口的類。
2. 在web.config或machine.config文件中注冊這個處理程序。
3.在Internet服務(wù)管理器中把文件擴(kuò)展(.15seconds)映射到ASP.NET ISAPI擴(kuò)展DLL(aspnet_isapi.dll)上。
***步
在Visual Studio.NET中建立一個新的C#類庫項(xiàng)目,并把它命名為“MyHandler”。Visual Studio.NET將自動地給項(xiàng)目添加一個叫做“Class1.cs”的類。把它改名為“NewHandler”;在代碼窗口中打開這個類,并把類的名稱和構(gòu)造函數(shù)的名稱改成“NewHandler”。
下面是NewHandler類的代碼:
- using System;
- using System.Web;
- namespace MyHandler
- {
- public class NewHandler : IHttpHandler
- {
- public NewHandler()
- {
- // TODO: 此處添加構(gòu)造邏輯
- }
- #region Implementation of IHttpHandler
- public void ProcessRequest(System.Web.HttpContext context)
- {
- HttpResponse objResponse = context.Response ;
- objResponse.Write("<html><body><h1>Hello 15Seconds Reader ") ;
- objResponse.Write("</body></html>") ;
- }
- public bool IsReusable
- {
- get
- {
- return true;
- }
- }
- #endregion
- }
- }
你在ProcessRequest方法中可以看到,該HTTP處理程序通過System.Web.HttpContext對象訪問了所有作為參數(shù)傳遞給它的ASP.NET內(nèi)部對象。實(shí)現(xiàn)ProcessRequest方法只需要簡單地從context對象中提取HttpResponse對象并把發(fā)送一些HTML給客戶端。類似地,IsReusable返回true,表明這個處理程序可以被重復(fù)用作處理其它的HTTP請求。
我們編譯上面的代碼并把它放到webapp虛擬目錄的bin目錄之中。
第二步
在web.config文件中通過添加下面的文本來注冊這個處理程序:
- <httpHandlers>
- <add verb="*" path="*.15seconds" type="MyHandler.NewHandler,MyHandler"/>
- </httpHandlers>
第三步
由于我們已經(jīng)建立了用于處理新擴(kuò)展文件的處理程序了,我們還需要把這個擴(kuò)展名告訴IIS并把它映射到ASP.NET。如果你不執(zhí)行這個步驟而試圖訪問Hello.15seconds文件,IIS將簡單地返回該文件而不是把它傳遞給ASP.NET運(yùn)行時。其結(jié)果是該HTTP處理程序不會被調(diào)用。
運(yùn)行Internet服務(wù)管理器,右鍵點(diǎn)擊默認(rèn)Web站點(diǎn),選擇屬性,移動到Home目錄選項(xiàng)頁,并點(diǎn)擊配置按鈕。應(yīng)用程序配置對話框彈出來了。點(diǎn)擊添加按鈕并在可執(zhí)行字段輸入aspnet_isapi.dll文件路徑,在擴(kuò)展字段輸入.15seconds。其它字段不用處理;該對話框如下所示:
點(diǎn)擊確認(rèn)按鈕關(guān)閉應(yīng)用程序配置和默認(rèn)Web站點(diǎn)屬性對話框。
現(xiàn)在我們運(yùn)行Internet Explorer并輸入url:http://localhost/webapp/hello.15seconds,看到的頁面如下:
【編輯推薦】