ASP.NET中处理HTTP请求的原理

ASP.NET中处理HTTP请求的原理 (转)

ASP.Net产生的大背景: 在Internet时代的开端,客户端的需求非常有限;.htm文件就可以满足他们的需求。但是,随着时间的流逝,客户端需求的扩充超越了.htm文件或静态文件所包含的功能。 开发者需要扩充或扩展Web服务器的功能。Web服务器厂商设计了不同的解决方案,但是都遵循同一个主题“向Web服务器插入某些组件”。所有的Web服务器补充技术都允许开发者建立并插入组件以增强Web服务器的功能。微软公司提出了ISAPI(Internet服务器API),网景公司提出了NSAPI(网景服务器API)等等。 由于这些组件的复杂性,实现它们非常困难。开发者不得不使用C/C++来开发这些组件,但是对于很多人来说,使用C/C++进行开发简直就是痛苦的代名词。 那么ASP.NET提供什么东西来实现这些功能呢?ASP.NET提供的是HttpHandler(HTTP处理程序)和HttpModule(HTTP模块)。

ASP.Net请求原理概述: ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把http请求传递给管道中的所有模块。每个模块都接收http请求并有完全控制权限。模块可以用任何自认为适合的方式来处理请求。一旦请求经过了所有HTTP模块,就最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过管道中的HTTP模块。 请注意在http请求的处理过程中,只能调用一个HTTP处理程序,然而可以调用多个HTTP模块 处理流程的图式:

请不要疑惑,这里只是简单说明了一些概念和处理流程,在随后的内容中我们还会详细介绍各个概念。

Http处理程序: 什么是Http处理程序(What): ASP.Net在处理请求的时候和其他开发语言不一样(比如:Structs,Spring,Jsf等等),它对于MVC的实现有些异类,我们的ASP.Net会根据不同类型的提交文件调用不同的Http处理程序类,这些处理方法的配置在我们的machine.config中都能够看到例如:

<httpHandlers> <add verb="*" path="trace.axd"(此时的文件全名为   trace.axd.cs 是通过添加class 的时候加上去的) type="System.Web.Handlers.TraceHandler"/> <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/> <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/> <add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/> <add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/> . . . . . . . . . . . . </httpHandlers> 在上面的配置信息中我们可以看到如果客户端请求的页面类型是*.aspx的话,那么我们的ASP.Net会直接把它分发给System.Web.UI.PageHandlerFactory来处理,这个工厂类会根据不同的请求需求产生相应的PageHandler类来处理此次请求,其它信息以次类推。 其中 verb=*表示:所有的请求都适用,如果只想处理Get和Post请求的话,那么可以这样写verb=”Post,Get” 或者是写成verb="*" Path表示处理的请求文件类型。 Type表示使用什么Http处理程序来处理 ,如若是一般的情况下(注:不是ashx文件的一般),则是完全限定名(命名空间.类名).程序集名(dll名称,但是不用写后缀名),如果用户想使用现在比较流行的Ajax.Net的话可以作如下配置:

<httpHandlers> <add verb="Post,Get" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro"/> </httpHandlers> 从上面的内容可以看出,如果使用Ajax.Net的话首先要说明它只支持Post和Get请求,只有在提交ashx这种Ajax文件的时候才作Ajax处理,处理类为 AjaxHandlerFactory创建出来的AjaxPro类。

为什么要使用Http处理程序(Why):         很明显Http处理程序可以被看成是ASP.Net体系架构中的控制层,当一张ASP.Net的aspx页面被请求后,会先把控制全转给特定Http处理程序【PageHandlerFactory】,该程序首先在IIS容器的输出缓存(OutputCache)中查找是否有对应的页面处理类的程序集(DLL),如果存在就直接调用,不存在的话就先将ASPX页面中的代码分离开来,将它编译成ASPX页面中配置的CodeBehinde属性对应的*.cs文件,随后将*.cs文件编译成中间语言(IL)存放在IIS中和输出缓存(OutputCache)中,整个过程便完成了一次ASPX页面的请求         Http处理程序在整个过程中明显扮演了控制层的作用。使用Http处理程序可以减轻表示层*.aspx页面和业务层*.cs的负担,使整个处理过程变得流程清晰和简洁。

        如何自定义Http处理程序类(How): 要能够创建自己的Http处理程序类必须实现.Net的System.Web.IHttpHandler接口,任何实现了IHttpHandler接口的类都可以用于处理输入的HTTP请求

HTTP处理程序实现了下列方法:

方法名称 描述
ProcessRequest 这个方法实际上是http处理程序的核心。我们调用这个方法来处理http请求。
IsReusable 我们调用这个属性来决定http处理程序的实例是否可以用于处理相同其它类型的请求。HTTP处理程序可以返回true或false来表明它们是否可以重复使用。
可以使用web.config或者machine.config文件把这些类映射到http请求上。映射完成以后,当接收到相应请求的时候ASP.NET会实例化http处理程序。我们将解释如何在web.config和/或machine.config文件中定义所有这些细节信息。

ASP.NET还通过IHttpHandlerFactory接口支持http处理程序的扩展。ASP.NET提供了把http请求路由到实现IHttpHandlerFactory接口的类的对象上的能力。此外,ASP.NET还利用了Factory设计模式。这种模式为建立一组相关对象而不提供具体类的功能提供了接口。简单的说,你可以把用于建立依赖传递进来的参数建立的http处理程序对象的类看作是factory(工厂)。我们不用指定需要实例化的特定的http处理程序;http处理程序工厂处理这种事务。这样做的优点在于如果未来实现IHttpHandler接口的对象的实现方法发生了改变,只要接口仍然相同,客户端就不会受到影响。

Http处理模块: 什么是Http处理模块(What):         在【ASP.Net请求原理概述】中我们已经知道,请求在进入管道后多个Http处理模块会在Http处理程序处理之前,抢先处理请求,这些处理模块其实就是一些普通的功能类,他们在服务启动的时候就驻留在了IIS容器中,当请求经过的时候处理模块会根据自身类的功能处理掉一些请求,比如Web.config中配置的身份验证,用户资源访问权限设置等都有对应的Http处理模块。

为什么要使用Http处理模块(Why):         Http处理模块可以减轻Http处理程序的压力,使整个请求过程变得畅通,在任何一个模块处理过程发生了异常都可以终止当前请求,这样不但提高了效率而且是处理更安全 处理以上的优点以外,Http处理模块还可以细分控制层,每个模块负责单一的处理工作,使得处理流程更明确。         和Http处理程序一样在Machine.config中同样配置了ASP.Net默认的一些处理模块,见下表:

<httpModules> <add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule>? <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/> <add name="PassportAuthentication" type="Security.PassportAuthenticationModule"/> <add name="UrlAuthorization" type="Security.UrlAuthorizationModule"/> <add name="FileAuthorization" type="Security.FileAuthorizationModule"/> </httpModules> ASP.NET使用上面一些HTTP模块来提供一些服务,例如身份验证和授权、对话管理和输出缓冲。由于这些模块都注册在machine.config文件中。

如何创建自定义的Http处理模块(How): 要创建自定义HTTP模块必须System.Web.IhttpModule接口的.NET组件。这些组件通过在某些事件中注册自身,把自己插入ASP.NET请求处理管道。当这些事件发生的时候,ASP.NET调用对请求有兴趣的HTTP模块,这样该模块就能处理请求了。 HTTP模块实现了IhttpModule接口的下面一些方法:

方法名称 描述
Init 这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。
Dispose 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。

总结:         其实ASP.Net变异的实现MVC框架技术,它的控制层(C)是由于实现了IhttpHander,IhttpHandlerFactory接口的Http处理程序类和实现了IhttpModule的Http处理模块类组成的,他们负责处理请求,如果学过Structs的同学知道它有点类似于ActionServlet和Jsf中的FacesServlet,而表示层(V)很明显就是那些Asp.Net的页面文件,而模型层(M)就是被控制层转译成*.cs文件的代码隐藏类 (CodeBehinde对应的类),虽然ASP.Net的MVC有点怪异,但是不可否认ASP.NET已经给开发者提供了强大的能量。

posted @ 2014-03-05 23:01  live in finally  阅读(473)  评论(0编辑  收藏  举报