`
lovnet
  • 浏览: 6725085 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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掉这个映射关系。

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassHelloWorldModule:IHttpModule
{
publicHelloWorldModule()
{
}

publicStringModuleName
{
get{return"HelloWorldModule";}
}

//IntheInitfunction,registerforHttpApplication
//eventsbyaddingyourhandlers.
publicvoidInit(HttpApplicationapplication)
{
application.BeginRequest
+=
(
newEventHandler(this.Application_BeginRequest));
application.EndRequest
+=
(
newEventHandler(this.Application_EndRequest));
}

privatevoidApplication_BeginRequest(Objectsource,
EventArgse)
{
//CreateHttpApplicationandHttpContextobjectstoaccess
//requestandresponseproperties.
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext
=application.Context;
context.Response.Write(
"<h1><fontcolor=red>HelloWorldModule:BeginningofRequest</font></h1><hr>");
}

privatevoidApplication_EndRequest(Objectsource,EventArgse)
{
HttpApplicationapplication
=(HttpApplication)source;
HttpContextcontext
=application.Context;
context.Response.Write(
"<hr><h1><fontcolor=red>HelloWorldModule:EndofRequest</font></h1>");
}

publicvoidDispose()
{
}
}

<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

分享到:
评论

相关推荐

    ASP.NET架构详解HttpHandler和HttpModule高清PDF文字版

    本书详细讲解了ASP.NET请求流程.以及核心对象. ASP.NET架构详解HttpHandler和HttpModule高清PDF文字. 我身边的ASP.NET工程师都看过这个啦

    关于HttpHandler与HttpModule的理解和应用方法

    神秘的HttpHandler与HttpModule 大学时候我是从拖控件开始学习asp.net的,对.net的很多类库对象都不是很了解。所以看到大家写一些个性的asp.net名词,就感觉asp.net总有一层神秘的面纱笼罩着,让我琢磨不透,相信...

    Asp.Net及相关技术介绍

    此PPT讲述了Asp.Net WebAPI及相关Web服务技术发展历史。 共80多页,Asp.Net WebAPI在讲到第36页的时候才会出现,因为这个技术不是凭空产生的,它有着自己的演变进化的历史。我们要先弄清它从哪里来的?然后再说它能...

    ASP.NET 编程模型介绍

    ASP.NET框架的编程模型:是指在ASP.NET框架响应客户端请求的整个过程中,按固定顺序执行的一系列处理步骤和事件

    深入理解asp.net里的IHttpHandler

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

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    本书适合于有一些ASP.NET基础知识的学习者以及准备迁移到ASP.NET 2.0的有经验的程序员和开发人员。 目录回到顶部↑ 第1章 ASP.NET 2.0概述 1 1.1 简史 1 1.2 ASP.NET 2.0的目标 2 1.2.1 开发人员的效率 3 ...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    自己动手写Web服务器(Socket、多线程)、ashx模式Web开发、ViewState、Cookie、Session、Http协议、Web开发基本原则、XSS漏洞防范、Request对象、Response对象、Server对象、虚拟路径、HttpHandler深入、ASP.Net...

    asp.net中实现类似AOP功能

    HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。而HttpModule实现了类似于ISAPI Filter的功能。

    ASP.NET2.0高级编程(第4版)1/6

    本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP...

    北京中科信软 Visual Basic.NET培训

    自定义HttpHandler与HttpModule,综合站点设计,N层架构设计 XML XMLDocument,XML Reader & Writer XML XPATH,XML XSLT,XML Schema XML & ADO.NET,XML & 配置文件 XML序列化 Web Service WSDL,SOAP,...

    HttpHandler HttpModule入门篇

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

    asp.net 请求输入到输出的全过程及httpHandler和httpModuler详细介绍

    最近看了几篇讲述httpHandler和HttpModuler的文章,总的来说还是Fish li的那篇文章给力,但是他是大牛,他写出来的文章技术含量太高,对于像我这样的小兵, 要完全看懂估计需要看几遍。虽然说没有完全了解底层操作,...

    HttpModule与HttpHandler

    HttpModule与HttpHandler! 值得下载看看!资源免费,大家分享!!

    模拟程序让你明白 WCF 运行过程

    通过一个普通的ASP.NET Web程序模拟了ASP.NET MVC的执行流程,现在我们通过类似的原理创建一个用于模拟WCF服务端和客户端工作原理的模拟程序。 一、基本的组件和执行流程 二、创建自定义HttpHandler实现对服务调用...

    MVC源码学习:打造自己的MVC框架

    2.2、Asp.net中常见的HttpHandler类型 ...................................................................................................... 7 2.3、自定义HttpHandler。 .....................................

Global site tag (gtag.js) - Google Analytics