HttpHandler HttpModule入门篇

来源:互联网 发布:新型网络传销模式 编辑:程序博客网 时间:2024/05/19 12:13

ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览 器中。

生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory,他们的执行(顺序)大致的执行过程是这样的:client端发送页面请求,被IIS的某个进程截获,它根据申请的页 面后缀(.aspx)不同,调用不同的页面处理程序(.asp->asp.dll; .aspx->ISAPI.dll).而页面处理程序在处理过程中,则要经历HttpModule,HttpHandler的处理:前者HttpModule用于页面处理前和处理后的一些事件的处理后者HttpHandler进行真正的页面的处理
如前所说,HttpModule会在页面处理前和后对页面进行处理,所以它不会影响真正的页面请求。通常用在给每个页面的头部或者尾部添加一些信息(如版 权声明)等.曾经见过一些免费的空间,我们的页面上传上去后,浏览的时候发现,在每个页面的头部和尾部多了很多小广告....,如果理解了 HttpModule的原理,要做这个就不是很难了~


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

 

ASP.Net系统本身配置有很多HttpHandler和HttpModule,以处理aspx等.Net标准的页面文件,以及这些页面文件中标 准的事件处理等。查看%System%/Microsoft.NET/Framework/v2.0.50727/CONFIG目录下的 web.config文件中的httpHandlers和httpModules节点,可以看到这些配置。如果有兴趣,可以使用Reflector查 看.Net系统中相关的类和方法,了解.Net如何处理以及做了什么处理。

.Net也提供了一套机制来开发自定义的HttpHandler和 HttpModule,均可以用于对HttpRequest的截取,完成自定义的处理。 HttpModule 继承System.Web.IHttpModule接口,实现自己的HttpModule类。必须要实现接口的两个方法:Init和Dispose。在 Init中,可以添加需要截取的事件;Dispose用于资源的释放,如果在Init中创建了自己的资源对象,请在Dispose中进行释放。

namespace MyModule

{

    public class MyHttpModule : IHttpModule

    {

        public MyHttpModule()

        {

        }

        //Init方法用来注册HttpApplication 事件。

        public void Init(HttpApplication r_objApplication)

        {

            r_objApplication.BeginRequest += new EventHandler(this.BeginRequest);

        }

        public void Dispose()

        {

        }

        private void BeginRequest(object r_objSender, EventArgs r_objEventArgs)

        {

            HttpApplication objApp = (HttpApplication)r_objSender;

            objApp.Response.Write("您请求的URL" + objApp.Request.Path);

        }

    }

}

 

将编译的dll文件拷贝到web项目的bin目录下,在web项目的web.config文件system.web节点中配置:
    这样就将自定义的HttpModule类MyHttpModule插入到了当前web的HttpModule的Pipeline中。 HttpModule主要功能是Application的各个事件进行截取,在这些事件中完成自己的处理。其实如果自己开发一些项目,直接在 Global.asax中处理已经足够了。如果是开发一个Framework或者是某些方面的组件,需要在事件中添加处理,开发自定义的 HttpModule,可以避免使用Framework或者组件时,还得手工在Global.asax中添加代码。     目前想到的开发自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪 等。当然,如果是结合自定义的HttpHandler进行Framework的开发,HttpModule可以用于其它的一些特殊的处理。

     <httpModules>

        <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/>

      </httpModules>

   注意要区分大小写,因为web.config作为一个XML文件是大小写敏感的。“type=MyHttpModuleTest.MyHttpModule,MyHttpModule”告诉我们系统将会将http request请求交给位于MyHttpModule.dll文件中的MyHttpModuleTest.MyHttpModule类去处理。HttpHandler是完全的对Http Request的截取。
    首先,继承System.Web.IHttpHandler接口,实现自己的HttpHandler类。必须要实现接口的ProcessRequest方法和IsReusable属性。ProcessRequest方法中完成对每个Http Request的处理,发送处理结果的HTML到输出缓存中。IsReusable属性被.Net Framework调用,用以确定这个HttpHandler的实例是否可以被重用于同类型其它的Request处理。
    如果你在自己的HttpHandler类中,需要读取或者是写Session值,需要再继承一个接口IRequiresSessionState。这个接口没有任何方法,只是一个标记接口。继承这个接口之后,就可以在自己的HttpHandler中访问Session,可以在Session中写入值。

 

namespace MyHandler

{

    public class MyHttpHandler : IHttpHandler, IRequiresSessionState

    {

        public MyHttpHandler() { }

        public bool IsReusable

        {

            get { return true; }

        }

        public void ProcessRequest(HttpContext context)

        {

            HttpResponse objResponse = context.Response;

            objResponse.Write("This request is handled by MyHttpHandler");

        }

    }

}

    把编译的dll文件拷贝到web项目的bin目录下。
    接下来,这样来测试一下MyHttpHandler。我们为IIS配置一个以.cc为后缀名的文件类型,用我们写的MyHttpHandler来处理。
    首先,在IIS站点的Configuration配置里面,添加一个对.cc后缀名处理的Application Extention Mapping项。  
    然后,在web项目的web.config节点中配置:

 

     <httpModules>

        <add verb="*" path="*.cc" type="MyHandler.MyHttpHandler,MyHandler"/>

      </httpModules>

 

    verb属性配置这个HttpHandler处理那些HTTP方法,例如GET、POST等,如果是处理所有方法,就用*。path属性配置HttpHandler对哪些文件进行处理,例如可以是myfile.cc,如果是处理所有的.cc文件,就用*.cc。
    这样,这个站点上所有.cc类型文件的访问,都由MyHttpHandler处理。使用http://localhost/站点虚拟目录/a.cc访问测试站点,可以看到测试效果。当然,a.cc这个文件在Web服务器上是并不存在的。

    对HttpHandler的使用,比较典型的有.Net的Web MVC开源项目Maverick。Maverick使用一个Dispatcher类对所有的Http Request进行截取,他以.m作为后缀名向Web服务器提交请求,在Dispatcher中,将.m的后缀去掉,提取Command Name,然后以这个command name从配置文件中加载处理的flow,形成一个chain,依次对chain上的各个command和view进行处理,对各个command和 view的处理结果可能会在chain中选择不同的处理分支,每个处理的Step中将处理结果的HTML写入Response的缓存中进行输出。
    总体来说,Maverick的框架架构概念很不错,但也存在明显的缺陷,以后有时间再详细的写写它的架构和需要改进之处。

    总之,将HttpModule、HttpHandler,以及使用Ajax等将客户端进行封装结合起来,能够给web项目的开发带来非常大的改善空间。

Asp.Net HttpHandler实现URL重写的
我们经常看到很多网站访问文章的时候才用的是***.html 或***.shtml (如本blog的日志访问效果),其时这写文件在服务器上不存在的,那为什么会出现这样的效果呢,是因为Web服务器上对URL执行了重写,把访问的 URL根据特定的格式重写成内部访问页面来实现的,它的好处是便于用户理解,同时搜索引擎也能更好地收入你的网站,当然其它的好处也很多,这里不做一一介 绍了。
本文所讲的是使用Asp.Net中的HttpHandler实现URL重写的,它所实现的原理请看这里,本程序可以处理任何Url,因为我在程序中使用了URL过虑,只有访问文件名是数字的才进行处理,并指在内部执行一个新的页面,并输出数据,代码如下:

        public void ProcessRequest(HttpContext Context)

        {

            try

            {

                //申明Request        

                HttpRequest Request = Context.Request;

                //取来路Url的绝对路径       

                string Url = Request.Url.AbsolutePath;

                //取访问的Web文件的开始字符间隔数

                int RegStart = Url.LastIndexOf("/") + 1;

                //申明一个确定Web文件名是否全是数字

                Regex Reg = new Regex(@"/d+");

                //用正则表达式进行匹配

                if (Reg.IsMatch(Url, RegStart))

                {

                    //如果web文件名是数字,则判定是查询相关文章,执行指定页面

                    Context.Server.Execute("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value);

                }

            }

            catch

            {

                Context.Response.Redirect(Context.Request.Url.ToString());

            }

        }

当然你首先要做的是先建一个类,并继承自IHttpHandler,然后把这段代码拷入,并编译。在Web项目中若要使用此功能,需要在web.config里面加上如下语句:

<httpHandlers>

        <add verb="*" path="*.shtml" type="HttpHandle.UrlRewrite" />

      </httpHandlers>

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

 

本文转自:http://www.cnblogs.com/cyan/archive/2009/02/04/1383580.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机安装包损坏无法安装怎么办 手机qq安装包损坏了怎么办 安装包损坏无法安装怎么办 方舟生存进化安装包损坏怎么办 如果安装包坏了怎么办 酷狗下载音乐收费怎么办 酷狗下载歌曲收费怎么办 酷狗音乐下载歌曲要钱怎么办 酷狗音乐下载要钱怎么办 手机酷狗音乐下载收费怎么办 咪咕视频静音了怎么办 卡西欧自拍神器死机了怎么办 手机一自拍就死机怎么办 微信怎么黑屏了怎么办 宝宝睡袋买大了怎么办 社保中间断了一年怎么办 京东阅读换手机怎么办 酷狗自动续费怎么办 qq音乐下载需要钱怎么办 电脑播放音乐没声音怎么办 酷狗账号注销了怎么办 电脑酷狗音乐没有声音怎么办 百度云的视频被净网怎么办 v380用户名或密码错误怎么办 课堂派没签到的怎么办 微信加密忘记了怎么办 视频容量太大上传不了视频怎么办 小米手机打不开主页面怎么办 qq离线文件过期了怎么办 百度云有转存任务正在进行怎么办 港版索尼手机的浏览器怎么办 手机下载文件不能直接打开怎么办 上传到电脑视频打不开了怎么办 百度云播放很卡怎么办 百度云视频很卡怎么办 考虫课程过期了怎么办 私教课程过期了怎么办 在异地交的社保怎么办 1岁宝宝吃粉笔怎么办 宝宝吃了彩色笔怎么办 宝宝吃了彩笔水怎么办