httpModule HttpHandler 区别整理

httpModule HttpHandler

                                                                                                转自年轻的蜗牛

 

ASP.NET的HTTP请求处理方法 当 客户端向web服务器请求一个*.aspx的页面文件时,这个http请求也会被inetinfo.exe进程截获(www服务),它判断文件后缀之后, 把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之 后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。 ------------------------------------ 当 一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入 到如下几个容器中: HttpModule --> HttpHandler Factory --> HttpHandler 当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。 完整的http请求在asp.net framework中的处理流程: HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest() 如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。

IHttpModule与IHttpHandler的区别整理 1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的 2.对请求的处理上:    IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.    IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它. 3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

HttpModule

一个HttpModule的例子如下:

复制代码
 1namespace MyModule  2{  3 public class MyHttpModule : IHttpModule  4 {  5    public MyHttpModule()  6    {  7    }  8    9    //Init方法用来注册HttpApplication 事件。 10     public void Init(HttpApplication r_objApplication) 11    { 12      r_objApplication.BeginRequest += new EventHandler(this.BeginRequest); 13    }     14 15    public void Dispose() 16    { 17    }     18 19    private void BeginRequest(object r_objSender, EventArgs r_objEventArgs) 20    { 21      HttpApplication objApp = (HttpApplication)r_objSender; 22      objApp.Response.Write("您请求的URL为" + objApp.Request.Path); 23    } 24 } 25} 26
复制代码

HttpModule主要功能是对Application的各个事件进行截取,在这些事件中完成自己的处理。其实如果自己开发一些项目,直接在 Global.asax中 处理已经足够了。如果是开发一个Framework或者是某些方面的组件,需要在事件中添加处理,开发自定义的 HttpModule,可以避免使用Framework或者组件时,还得手工在Global.asax中添加代码。     目前想到的开发自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪 等。当然,如果是结合自定义的HttpHandler进行Framework的开发,HttpModule可以用于其它的一些特殊的处理。        <httpModules>          <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/>        </httpModules>

注,对配置的解释:<add   name="随便命名"   type="HttpModule命名空间加类名,dll文件名"   />    注意要区分大小写,因为web.config作为一个XML文件是大小写敏感的。 “type=MyHttpModuleTest.MyHttpModule,MyHttpModule”告诉我们系统将会将http request请求交给位于MyHttpModule.dll文件中的MyHttpModuleTest.MyHttpModule类去处理。

HttpHandler:

HttpHandler是完全的对Http Request的截取。     首先,继承System.Web.IHttpHandler接口,实现自己的HttpHandler类。必须要实现接口的ProcessRequest方 法和IsReusable属性。ProcessRequest方法中完成对每个Http Request的处理,发送处理结果的HTML到输出缓存中。IsReusable属性被.Net Framework调用,用以确定这个HttpHandler的实例是否可以被重用于同类型其它的Request处理。     如果你在自己的HttpHandler类中,需要读取或者是写Session值,需要再继承一个接口IRequiresSessionState。这个接 口没有任何方法,只是一个标记接口。继承这个接口之后,就可以在自己的HttpHandler中访问Session,可以在Session中写入值。 httpHandler Url重写的实现:

 

复制代码
 1public void ProcessRequest(HttpContext Context)  2{      3try   4{          5    //申明Request           6    HttpRequest Request = Context.Request;   7    //取来路Url的绝对路径          8    string Url = Request.Url.AbsolutePath;   9    //取访问的Web文件的开始字符间隔数 10    int RegStart = Url.LastIndexOf("/"+ 111    //申明一个确定Web文件名是否全是数字 12    Regex Reg = new Regex(@"\d+");  13    //用正则表达式进行匹配  14    if (Reg.IsMatch(Url, RegStart))  15    16    //如果web文件名是数字,则判定是查询相关文章,执行指定页面  17    Context.Server.Execute("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value);         18}     19} 20catch 21{ 22     Context.Response.Redirect(Context.Request.Url.ToString());  23} 24}
复制代码

当然你首先要做的是先建一个类,并继承自IHttpHandler,然后把这段代码拷入,并编译。在Web项目中若要使用此功能,需要在web.config里面加上如下语句: <httpHandlers>     <add verb="*" path="*.shtml" type="HttpHandle.UrlRewrite" /> </httpHandlers> 注释:verb属性配置这个HttpHandler处理那些HTTP方法,例如GET、POST等,如果是处理所有方法,就用*。path属性配置HttpHandler对哪些文件进行处理,例如可以是myfile.cc,如果是处理所有的.cc文件,就用*.cc。

同时,还要在IIS中对Web项目进行配置,在Web项目的属性中,在主目录选项卡里,把执行权限改为"脚本和可执行文件",然后打开配置,在应用程序扩展里加上需重写的文件格式的扩展

posted @ 2014-08-22 13:31  陈仁华  阅读(210)  评论(0编辑  收藏  举报