美文网首页HTTP请求
HttpModuler与HttpHandler介绍和简单使用

HttpModuler与HttpHandler介绍和简单使用

作者: 无为无味无心 | 来源:发表于2018-11-05 10:30 被阅读0次

    1 Asp.Net中的处理流程

    当客户端请求一个*文件的时候,这个请求会被inetinfo.exe(IIS相关的系统组件)进程截获,它判断文件类型后,将这个请求转交给ASPNET_ISAPI.dllASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端。

    inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。

    ASPNET_ISAPI.DLL:是处理.aspx文件的win32组件。其实IIS服务器是只能识别静态文件的,当IIS服务器发现被请求的文件是.aspx文件时,IIS服务器将其交给aspnet_isapi.dll来处理。

    aspnet_wp.exe进程:ASP.NET框架进程,提运行的托管环境的CLR(公共语言运行时)就是寄存在此进程中。

    ASP.NET Framework处理一个Http Request的流程:

    HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

    ASP.NET请求处理过程基于管道模型,管道模型由多个HttpModule和HttpHandler组成(默认19个管道事件),ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端,可以在每个HttpModule中都可以干预请求的处理过程。

    2 HttpModule

    2.1 自定义,实现System.Web.IHttpModule接口的类。

    这里以简单在处理完请求后,输出一些公司的版权信息为例,关于context 可以注册的事件为19个,详细介绍参照图1.ASP.NET管道事件和页面生命周期示意图

    
    public class WriteCompanyInfoModuler : System.Web.IHttpModule
    
    {
    
    public void Init(HttpApplication context)
    
    {
    
    context.EndRequest += new EventHandler((s, e) =>
    
    {
    
    HttpApplication httpAplication = (HttpApplication)s;
    
    httpAplication.Response.Write("<!--VoBao CompanyInfo-->");
    
    });
    
    }
    
    public void Dispose()
    
    {
    
    }
    
    }
    

    然后在Web.config 中配置如下节点System.web节点下:

    <httpModules>
    
    <add name="WriteCompanyInfoModuler" type="MyModuler.WriteCompanyInfoModuler"></add>
    
    </httpModules>
    

    name 为Moduler的名字,type:有两部分组成,前半部分是命名空间和类名组成的全名,后半部分是程序集名称。

    可以在网站的任何一个网页下看到,如下信息:

    clipboard.png

    图一---ASP.NET管道事件和页面生命周期示意图(图片来源于黑马学生)


    clipboard.png

    在httpModule中自定义自己的HttpModule 可以实现登录,权限控制等操作。

    3 HttpHandler

    HttpHandler是处理客户端的请求上下文的最后步骤,对服务器页面进行编译实例化执行,将处理后的信息返回给客户端,一旦自定义HttpHandler 将覆盖系统的默认HttpHander.

    3.1 示例:自定义文件类型,可以做验证码路径,UrlReWrite等。

    public class MyHttpHandler : IHttpHandler
    
    {
    
    public MyHttpHandler(bool isReusable)
    
    {
    
    IsReusable = isReusable;
    
    }
    
    public void ProcessRequest(HttpContext context)
    
    {
    
    //处理请求,返回请求
    
    context.Response.Write("这个自定义的shtml文件");
    
    }
    
    public bool IsReusable { get; private set; }
    
    }
    

    web.config配置:

    <httpHandlers>
    
      <add verb="get" path="*.shtml" type="MyHttpHandlers.MyHttpHandler"></add>
    
    </httpHandlers>
    

    3.2 注意

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

    4 IHttpModule与IHttpHandler的区别整理

    1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的

    2.对请求的处理上:

    IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.

    IHttpHandler则属于挑食类型,只有注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.

    3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

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

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

    以上参考:http://www.educity.cn/develop/474379.html

    相关文章

      网友评论

        本文标题:HttpModuler与HttpHandler介绍和简单使用

        本文链接:https://www.haomeiwen.com/subject/qtgjxqtx.html