• HttpModule HttpHandler HttpHandlerFactory 学习笔记


    1。HttpModule

        最常见的是使用HttpModule来做页面权限控制。

        在新建类库添加如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    namespace HttpModuleCK
    {
     
        public class UserControl : IHttpModule
        {
            public void Dispose()
            { }
     
            public void Init(HttpApplication context)
            {
                context.BeginRequest += new System.EventHandler(httpApplication_BeginRequest);
            }
     
            public void httpApplication_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication httpApplication = (HttpApplication)sender;
                string url = httpApplication.Context.Request.Path;
                //做用户权限控制
                HttpContext content = (HttpContext)httpApplication.Context;
     
                //if (httpApplication.Request["userid"] == null)
                //{
                //    content.Response.Write("未提供必需的参数!!");
                //    content.Response.End();
                //}
            }
     
     
     
     
        }
    }

       在Web项目中添加引用该类,添加配置信息即可,

    1
    2
    3
    <httpModules>
          <add name="UserRight" type="HttpModuleCK.UserControl, HttpModuleCK"/>  
            </httpModules>

    2.HttpHandler

    这个常用来做文件访问控制,图片防盗链等等.

    新建类库添加如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
     
     
    namespace HttpHandlerCK
    {
        public class docHandle:IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                string FileName = context.Server.MapPath(context.Request.FilePath);
                if (context.Request["userid"] == null)
                {
                    context.Response.Write("doc文件无法访问!!");
                    context.Response.End();
                }
                
            }
     
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }
    在Web项目的config中配置如下:
    1
    2
    3
    <httpHandlers>
      <add verb="*" path="*.doc" type="HttpHandlerCK.docHandle, HttpHandlerCK"/>
         </httpHandlers>

    3.HttpHandlerFactory

      功能比HttpHandler要更加强大,HttpHandlerFactory是HttpHandler的工厂,通过它来生成不同的HttpHandler对象。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    namespace HandlerFactoryCK
    {
        public class aspxHandle: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)
            {
     
            }
     
        }
    }
      在Webconfig配置如下:
    1
    2
    3
        <httpHandlers>
          <add verb="*" path="*.aspx" type="HandlerFactoryCK.aspxHandle, HandlerFactoryCK"/>
    </httpHandlers>

    三者的区别如下:

      生命周期中涉及到几个非常重要的对象: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对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

  • 相关阅读:
    架构师之路(4)详解面向对象 王泽宾 (转)
    输出螺旋矩阵(一)
    输出螺旋矩阵(三)
    excel sheet中数据的快速复制
    计算数组的维数
    不绑定记录集获取datagrid某行某列的内容
    API判断数组是否为空
    将某网页的某框架内容显示在WEBBROWSER中
    输出螺旋矩阵(二)
    快速删除一个包含文件和子文件夹的文件夹
  • 原文地址:https://www.cnblogs.com/sunshch/p/3691440.html
Copyright © 2020-2023  润新知