当前位置: 首页 > news >正文

ASP.NET内部原理(HttpHandler和HttpModule)

 

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器。其实ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,
-------------------------------------


ASP.NET的HTTP请求处理方法
当客户端向web服务器请求一个*.aspx的页面文件时,同asp类似,这个http请求也会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。
------------------------------------
当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:
HttpModule --> HttpHandler Factory --> HttpHandler
当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。
完整的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()
如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。
----------------------------------------
系统本身的HttpModule实现一个IHttpModule的接口,当然我们自己的类也能够实现IHttpModule接口,这就可以替代系统的HttpModule对象了。
ASP.NET系统中默认的HttpModule:

DefaultAuthenticationModule 确保上下文中存在 Authentication 对象。无法继承此类。
FileAuthorizationModule 验证远程用户是否具有访问所请求文件的 NT 权限。无法继承此类。
FormsAuthenticationModule 启用 ASP.NET 应用程序以使用 Forms 身份验证。无法继承此类。
PassportAuthenticationModule 提供环绕 PassportAuthentication 服务的包装。无法继承此类。
SessionStateModule   为应用程序提供会话状态服务。
UrlAuthorizationModule   提供基于 URL 的授权服务以允许或拒绝对指定资源的访问。无法继承此类。
WindowsAuthenticationModule 启用 ASP.NET 应用程序以使用 Windows/IIS 身份验证。无法继承此类

--------------------------------------
这些系统默认的HttpModule是在文件machine.config中配置的,和我们开发时使用到的web.config的关系是:是在ASP.NET FRAMEWORK启动处理一个Http Request的时候,它会依次加载machine.config和请求页面所在目录的web.config文件,如果在machine中配置了一个自己的HttpModule,你仍然可以在所在页面的web.config文件中remove掉这个映射关系。

ContractedBlock.gif ExpandedBlockStart.gif Code
public class HelloWorldModule : IHttpModule
{
    
public HelloWorldModule()
    {
    }

    
public String ModuleName
    {
        
get { return "HelloWorldModule"; }
    }

    
// In the Init function, register for HttpApplication 
    
// events by adding your handlers.
    public void Init(HttpApplication application)
    {
        application.BeginRequest 
+= 
            (
new EventHandler(this.Application_BeginRequest));
        application.EndRequest 
+= 
            (
new EventHandler(this.Application_EndRequest));
    }

    
private void Application_BeginRequest(Object source, 
         EventArgs e)
    {
    
// Create HttpApplication and HttpContext objects to access
    
// request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context 
= application.Context;
        context.Response.Write(
"<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
    }

    
private void Application_EndRequest(Object source, EventArgs e)
    {
        HttpApplication application 
= (HttpApplication)source;
        HttpContext context 
= application.Context;
        context.Response.Write(
"<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
    }

    
public void Dispose()
    {
    }
}

    <system.web>
<httpModules>
   <add name="HelloWorldModule" type="HelloWorldModule"/>
</httpModules>
    </system.web>
-----------------------------------------------------------------------------------
深入HttpModule
一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给HttpModule
上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括BeginRequest,EndRequest,AuthentiacteRequest 等等。
-----------------------------------------------------------------
IHttpHandler
它是asp.net Framework提供的一个接口,定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定。也就是说,如果你想要自行处理某些类型的HTTP请求信息流的话,你需要实现这些系统约定才能做到。譬如一个*.aspx文件,用来处理此类型的Http请求,ASP.NET FRAMEWORK将会交给一个名为System.Web.UI.PageHandlerFactory的HttpHandler类来处理。
HH和HM一样,系统会在最初始由ASP.NET FRAMEWORK首先加载machine.config中的HttpHandler,而后会加载Web应用程序所在目录的web.config中的用户自定义的HttpHandler类。但是系统与我们自定义的HH之间的关系是"覆盖"的,也就是说如果我们自定义了一个针对"*.aspx"的HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理,而我们自己的HttpHandler类则需要自己完全解析这个Http请求,并作出处理。
IHttpHandler接口中最重要的方法ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到HttpHandler容器中的时候,framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。
framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的,而是定位到了其 内部默认的IHttpHandler Factory上了。IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

 

http://hi.baidu.com/easyli1985/blog/item/7955ed12683d62cbc2fd7868.html

转载于:https://www.cnblogs.com/gaoweipeng/archive/2009/05/23/1487513.html

相关文章:

  • SQL Server中临时表与表变量的区别
  • Pro C# 2008 and the .NET 3.5 Platform学习过程
  • 魔兽世界真的还值得你玩下去么?
  • 图解ASP.NET AJAX 1.0 RC开发
  • 动脑筋
  • 在Exchange 2003的03域改名
  • RHEL4- FTP服务(一)vsftpd的安装与启动
  • javascript中获取地址栏参数
  • WCF 4.0中的WS-Discovery
  • 《亮剑.NET:.NET深入体验与实战精要》前言
  • 在 Java 应用程序中定时执行任务
  • 我的座右铭
  • javascript:history.go()和History.back()的区别
  • 如何删除“运行”里面的内容
  • 认真对待生活的每一件事
  • 《深入 React 技术栈》
  • 【译】理解JavaScript:new 关键字
  • ES6--对象的扩展
  • JavaScript实现分页效果
  • javascript数组去重/查找/插入/删除
  • Java比较器对数组,集合排序
  • mockjs让前端开发独立于后端
  • nfs客户端进程变D,延伸linux的lock
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vue.js 移动端适配之 vw 解决方案
  • Yeoman_Bower_Grunt
  • 理清楚Vue的结构
  • 双管齐下,VMware的容器新战略
  • 探索 JS 中的模块化
  • 跳前端坑前,先看看这个!!
  • 用jQuery怎么做到前后端分离
  • elasticsearch-head插件安装
  • 整理一些计算机基础知识!
  • #QT(串口助手-界面)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (bean配置类的注解开发)学习Spring的第十三天
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (转载)Linux 多线程条件变量同步
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Autowired 与@Resource的区别
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @拔赤:Web前端开发十日谈
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [android] 看博客学习hashCode()和equals()
  • [Android]常见的数据传递方式
  • [C#] 我的log4net使用手册
  • [C++] new和delete
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [docker] Docker的私有仓库部署——Harbor
  • [HackMyVM]靶场 Wild
  • [IE9] IE9 Beta崩溃问题解决方案
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法