1. 程式人生 > >C#強化系列:HttpModule,HttpHandler,HttpHandlerFactory簡單使用

C#強化系列:HttpModule,HttpHandler,HttpHandlerFactory簡單使用

判斷 response exec 例子 所有 pri 需要 系統默認 return

這三個對象我們在開發Asp.net程序時經常會用到,似乎很熟悉,但有時候又不太確定。本文通過一個簡單的例子來直觀的比較一下這三個對象的使用。
HttpModule:Http模塊,可以在頁面處理前後、應用程序初始化、出錯等時候加入自己的事件處理程序
HttpHandler:Http處理程序,處理頁面請求
HttpHandlerFactory:用來創建Http處理程序,創建的同時可以附加自己的事件處理程序

例子很簡單,就是在每個頁面的頭部加入一個版權聲明。
一、HttpModule
這個對象我們經常用來進行統一的權限判斷、日誌等處理。
例子代碼:

技術分享圖片 public class MyModule : IHttpModule
技術分享圖片
{
技術分享圖片 public void Init(HttpApplication application)
技術分享圖片 {
技術分享圖片 application.BeginRequest += new EventHandler(application_BeginRequest);
技術分享圖片 }
技術分享圖片
技術分享圖片 void application_BeginRequest(object sender, EventArgs e)
技術分享圖片 {
技術分享圖片 ((HttpApplication)sender).Response.Write("Copyright @Gspring<br/>");
技術分享圖片
}
技術分享圖片
技術分享圖片 public void Dispose()
技術分享圖片 {
技術分享圖片 }
技術分享圖片 }技術分享圖片

web.config中配置:

技術分享圖片 <httpModules>
技術分享圖片 <add name="test" type="HttpHandle.MyModule, HttpHandle"/>
技術分享圖片 </httpModules>

在Init方法中可以註冊很多application的事件,我們的例子就是在開始請求的時候加入自己的代碼,將版權聲明加到頁面的頭部

二、HttpHandler

這個對象經常用來加入特殊的後綴所對應的處理程序,比如可以限制.doc的文件只能給某個權限的人訪問。
Asp.Net中的Page類就是一個IHttpHandler的實現
例子代碼:

技術分享圖片 public class MyHandler : IHttpHandler
技術分享圖片 {
技術分享圖片 public void ProcessRequest(HttpContext ctx)
技術分享圖片 {
技術分享圖片 ctx.Response.Write("Copyright @Gspring<br/>");
技術分享圖片 }
技術分享圖片 public bool IsReusable
技術分享圖片 {
技術分享圖片 get { return true; }
技術分享圖片 }
技術分享圖片 }
技術分享圖片

web.config中配置:

技術分享圖片 <httpHandlers>
技術分享圖片 <add verb="*" path="*.aspx" type="HttpHandle.MyHandler, HttpHandle"/>
技術分享圖片 </httpHandlers>
技術分享圖片

這個對象主要就是ProcessRequest方法,在這個方法中輸出版權信息,但同時也有一個問題:原來的頁面不會被處理,也就是說頁面中只有版權聲明了。那麽所有的aspx頁面都不能正常運行了

三、HttpHandlerFactory

這個對象也可以用來加入特殊的後綴所對應的處理程序,它的功能比HttpHandler要更加強大,在系統的web.config中就是通過註冊HttpHandlerFactory來實現aspx頁面的訪問的:

技術分享圖片 <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>技術分享圖片

HttpHandlerFactory是HttpHandler的工廠,通過它來生成不同的HttpHandler對象。

例子代碼:

技術分享圖片 public class MyHandlerFactory : IHttpHandlerFactory
技術分享圖片 {
技術分享圖片 public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
技術分享圖片 {
技術分享圖片 PageHandlerFactory factory = (PageHandlerFactory)Activator.CreateInstance(typeof(PageHandlerFactory), true);
技術分享圖片 IHttpHandler handler = factory.GetHandler(context, requestType, url, pathTranslated);
技術分享圖片
技術分享圖片 //執行一些其它操作
技術分享圖片 Execute(handler);
技術分享圖片
技術分享圖片 return handler;
技術分享圖片 }
技術分享圖片
技術分享圖片 private void Execute(IHttpHandler handler)
技術分享圖片 {
技術分享圖片 if (handler is Page)
技術分享圖片 {
技術分享圖片 //可以直接對Page對象進行操作
技術分享圖片 ((Page)handler).PreLoad += new EventHandler(MyHandlerFactory_PreLoad);
技術分享圖片 }
技術分享圖片 }
技術分享圖片
技術分享圖片 void MyHandlerFactory_PreLoad(object sender, EventArgs e)
技術分享圖片 {
技術分享圖片 ((Page)sender).Response.Write("Copyright @Gspring<br/>");
技術分享圖片 }
技術分享圖片
技術分享圖片 public void ReleaseHandler(IHttpHandler handler)
技術分享圖片 {
技術分享圖片 }
技術分享圖片 }

web.config中配置:

技術分享圖片 <httpHandlers>
技術分享圖片 <add verb="*" path="*.aspx" type="HttpHandle.MyHandlerFactory, HttpHandle"/>
技術分享圖片 </httpHandlers>

在例子中我們通過調用系統默認的PageHandlerFactory類進行常規處理,然後在處理過程中加入自己的代碼,可以在Page對象上附加自己的事件處理程序。

附一個小的惡作劇:
我們可以開發好aspx頁面,然後把web應用程序發布後把所有的aspx文件的後綴都改為spring,再在web.config中加入配置:

技術分享圖片 <httpHandlers>
技術分享圖片 <add verb="*" path="*.spring" type="HttpHandle.MyHandlerFactory, HttpHandle"/>
技術分享圖片 </httpHandlers>
技術分享圖片 <compilation>
技術分享圖片 <buildProviders>
技術分享圖片 <add extension=".spring" type="System.Web.Compilation.PageBuildProvider"/>
技術分享圖片 </buildProviders>
技術分享圖片 </compilation>

buildProviders是用來指定spring後綴的編譯程序,我們把它設置成和aspx一致就可以了。如果在IIS中發布的話還需要在應用程序配置中加入spring的後綴映射。
然後我們就可以通過 http://../.../*.spring來訪問我們的網站了技術分享圖片

出處:https://www.cnblogs.com/firstyi/archive/2008/05/07/1187274.html

C#強化系列:HttpModule,HttpHandler,HttpHandlerFactory簡單使用