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

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

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模块)。web

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

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

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处理程序实现了下列方法:post

方法名称 描述
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已经给开发者提供了强大的能量。

相关文章
相关标签/搜索