码迷,mamicode.com
首页 > 其他好文 > 详细

httpModule HttpHandler 区别整理

时间:2014-08-22 14:24:08      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   java   使用   os   io   strong   

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的例子如下:

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

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重写的实现:

 

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

当然你首先要做的是先建一个类,并继承自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项目的属性中,在主目录选项卡里,把执行权限改为"脚本和可执行文件",然后打开配置,在应用程序扩展里加上需重写的文件格式的扩展

httpModule HttpHandler 区别整理

标签:style   blog   http   color   java   使用   os   io   strong   

原文地址:http://www.cnblogs.com/chenrenhua/p/3929214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!