zoukankan      html  css  js  c++  java
  • HttpHandler与HttpModule区别

    刚开始看这两个接口时很是迷糊了一阵子.感觉没什么不一样的地方,功能放在httpmodule和httphandler中好像都可以.后来搜了很多帖子,但都是说如何如何实现的,然后就告诉你这个代码放到哪,那个代码放到哪,看完还是不明白为什么非要这么放!(小弟头脑逻辑性比较差.只好到处去翻.)真是皇天不负有心人,得偿所望啊.

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

    HttpModule会在页面处理前和后对页面进行处理,所以它不会影响真正的页面请求。通常用在给每个页面的头部或者尾部添加一些信息(如版 权声明)等.

     

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

     

    HttpModule 继承System.Web.IHttpModule接口,实现自己的HttpModule类。必须要实现接口的两个方法:Init和Dispose。在 Init中,可以添加需要截取的事件;Dispose用于资源的释放,如果在Init中创建了自己的资源对象,请在Dispose中进行释放。

    例:    public class TestHttpModule:IHttpModule
        {

            public void Dispose()
            }

            public void Init(HttpApplication context)
            {
                context.BeginRequest += new EventHandler(context_BeginRequest);
            }

            void context_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication appliction = sender as HttpApplication;
                appliction.Response.Write("HttpModule请求的URL:" + appliction.Request.Url.AbsolutePath);
            }
        }

    自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪 等

     

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

            public bool IsReusable
            { get { return true; } }

            public void ProcessRequest(HttpContext context)
            {
                string s = context.Request.Url.AbsolutePath;
                context.Server.Execute("default.aspx?execute=" + context.Server.UrlEncode(s));//URL重定向
            }
        }

    <add verb="*" path="*.shtml" type="UI.Core.Http.TestHandler,UI"/>

    对于请求时的 a.shtml可以不存在


    IHttpModule与IHttpHandler的区别主要有两点(实际上大家看MSDN时应该也注意到了):
        1.先后次序.先IHttpModule,后IHttpHandler.
        2.对请求的处理上:
            IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
            IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.

    下面是具体的实例.来源引用MSDN.

    如何继承并实现IHttpModule


    如何设置<httpModules> 元素


    自定义 HttpModule 示例


    如何设置<httpHandlers> 元素


    如何创建 HttpHandler

  • 相关阅读:
    产品经理的创新思维
    大型互联网网站架构心得之二:并、换和其它(转)
    访问IIS元数据库失败解决方法(转)
    (转)SQL Server 假执行,预执行
    从LiveJournal后台发展看 大型网站系统架构以及性能优化方法(转)
    浏览器并发连接数
    转:Session服务器配置指南与使用经验
    转:安装IIS无法找到zClientm.exe文件的解决办法
    使用开源软件,设计高性能可扩展互动网站
    大型互联网网站架构心得之一:分(转)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1997147.html
Copyright © 2011-2022 走看看