• HttpModule 和 HttpHandler


    HttpModule和HttpHandler回顾:

    HttpModule

    1.完整的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()
    ps:红色的HttpApplication实例在HttpModuleInit方法中会用到。

    2.HttpModule工作原理

    负责监听HttpRequest,同时对HttpRequest增添或者过滤掉一部分内容。也就是说,当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。
    HttpModule实现了接口IHttpModule,我们可以自定义实现该接口的类,从而取代HttpModule。
    asp.net默认的HttpModule如下:

            System.Web.SessionState.SessionStateModule;
            System.Web.Security.WindowsAuthenticationModule;
            System.Web.Security.FormsAuthenticationModule;
            System.Web.Security.PassportAuthenticationModule;
            System.Web.Security.UrlAuthorizationModule;
            System.Web.Security.FileAuthorizationModule;

    3、编写自己的HttpModule
    要实现HttpModule,必须实现接口IHttpModule。

    web.config的节点配置
    在Web.config的system.web标签中添加:
            <httpModules>
                <add name="XXX" type="XXHttpModule.XyHttpModule,XXHttpModule"></add>
            </httpModules>
    a、name可以随意指定,没有影响。
    b、type有两个参数,第一个表示具体哪个类,第二个表示是哪个dll。

    4.加载两个或多个自定义的HttpModule
    这里以两个自定义HttpModule举例.
    修改配置文件中的httpModules节点:
    <add name="XXX" type="XXHttpModule.XyHttpModule1,XXHttpModule"></add>
    <add name="XXX" type="XXHttpModule.XyHttpModule2,XXHttpModule"></add>

    运行:
    a、在web.config文件中引入自定义HttpModule的顺序决定了多个自定义HttpModule在处理一个HTTP请求的顺序;
    b、系统默认HttpModule是最先被ASP.NET Framework所加载上去的,对外部是透明的。

    c、对于一个HttpModule,在BeginRquest中终止,但是仍然会调用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也可以说是直接跳转到EndRequest事件,而不会调用这期间的事件

    d、如果有两个HttpModule,在第一个HttpModule的BeginRequest中终止,仅仅不会调用第二个HttpModule的BeginRequest,但仍然会调用两个EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。

    HttpHandler

    HttpHandler是一个HTTP请求的真正处理中心。在HttpHandler容器中,ASP.NET Framework才调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

    以aspx页面为例,正是在HttpHandler这里,一个aspx页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。当然,对于aspx页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。当一个HTTP请求到达这个HttpHandlerFactory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。 一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。

    1.实现HttpHandler,必须继承自IHttpHandler接口。

    要在HttpHandler使用Session,必须要实现IRequiresSessionState接口
    配置文件
    在web.config文件的system.web节点下,添加:
          <httpHandlers>        
            <add verb="*" path="*" type="XXHandler.X1TestHandler, XXHandler"/>
          </httpHandlers>

    HttpHandler和HttpModule的区别
    主要有两点:
     (1)先后次序.先IHttpModule,后IHttpHandler,IHttpHandler处理结束后再交给IHttpModule;
     (2)对请求的处理上:
            IHttpModule是针对所有的请求文件,无论客户端请求的是什么文件类型,都会调用到它;例如aspx,html,rar的请求;
            IHttpHandler是针对一类型的文件,只有asp.net注册过的文件类型才会调用它。

    HttpModuleu应用场景:

    1.统一内容处理,EndRequest处理

    2.身份验证: AcquireRequestState和PreRequestHandlerExecute处理

    3.页面限流,页面访问量统计:BeginRequest处理

  • 相关阅读:
    javascript typeof 和 instanceof 的区别和联系
    || and && 理解
    jquery选择器总结
    overflow-y:auto 回到顶部
    HTML 获取屏幕,浏览器,页面的高度
    height()、innerHeight()、outerHeight()函数的区别详解
    git入门篇-----本地操作
    sublime快捷键
    Atom 和 VSCode 同一天发布神器:实时编码分享
    编辑器插件和配置备份神器--sync setting
  • 原文地址:https://www.cnblogs.com/shw0099/p/6382712.html
Copyright © 2020-2023  润新知