HTTP管线

   1  IIS对请求的处理

        IIS接收到一个请求服务后(HttpRequest发送的请求),会检查请求的资源文件类型,将请求传递到ASP.NET  ISAPI资源扩展(aspnet_isap.dll)

        aspnet_isap.dll是一个检索资源文件类型的dll,如果没有,需进行注册,如果有,会进行排队,并将相关请求(HttpRequest)分配在进程中

        此时系统会通过管线处理该请求.

       (相关代码理解:HttpRequest请求传到IIS工作进程(IIS5.x为aspnet_wp.ext,IIS6,x和IIS7.x为w3wp.exe)后,工作进程实例通过ISAPIRuntime(主要作用是调用一些

        非托管代码生成HttpWorkRequest对象,HttpWorkerRequest对象包韩当前请求的所有信息,然后传递给HttpRuntime)

 

   2 管线程序的处理

        HttpRuntime时管线程序的入口,会根据HttpWorkRequest对象生成HttpContext,HttpContext包含request,response等属性,再调用HttpApplicationFactory的GetApplicationInstance方法生成HttpApplication,HttpApplication对象包含多个HttpModule,HttpModule是一个Http请求的必经之路,可以在这个Http请求传递到真正的请求中心(HttpHandler)之前附加一些需要的信息在Http请求之上,或者针对截获的这个请求信息作一些额外的工作,起到一个过滤器的作用.最终请求会传递到HttpHandler进行专门处理

管线的控制是由HttpApplication对象控制.

 
3 HttpHandler处理
  HttpHandler也是管理程序的一部分,他是范指一类实现了IHttpHandler接口的类型,这个类型都是用来处理Http请求的 如*.ashx文件就是一个HttpHandler
 
3.1 HttpHandler映射
   在Asp.net的管线事件中,第10个事件[根据所请求的资源文件扩展名(在应用程序的配置文件中映射),实现相关的IhttpHandler类,对请求进行处理。有3个方法调用
   1. this.GetHandlerMapping(context, requestType, path, useAppConfig)
   2. this.GetFactory(mapping)
   3. factory.GetHandler(context, requestType, path.VirtualPathString, pathTranslated)
   4. RemapHandler(IHttpHandler)
 
  GetHandlerMapping方法会根据请求的URL地址,以及Http调用动作(Post,Get),返回一个在Config的<HttpHandlers>的定义配置项(HttpHandlerAction类型)
当请求与每个规则匹配后,Asp.net会调用HttpHandlerFactory的GetHandler()方法来获取一个HttpHandler实例,最后由这个HttpHandler实例来处理当前请求.
  在GetHandlerMapping()方法返回一个HttpHandlerAction类型后,HttpApplication会调用this.GetFactory(Mapping)获取一个IHttpHandlerFactory对象,HttpApplication会根据Web.Config配置去查找一个IHttpHandlerFactory对象,如果我们配置的是自定义的IHttpHandler,Asp.net会创建一个HttpFactoryWrapper对象来包装IHttpHandler,如果我们配置的是IHttpHandlerFactory对象,则直接返回,设计和创建IHttpHandlerFactory的目的就是在创建和重用IHttpHandler时,保留足够多的扩展机会,在ASP.NET中,有一个IHttpHandlerFactory接口,IHttpHandlerFactory,IHttpHandlerFactory2,其中后一个是一个仅共微软使用的内部接口
 

我们都知道aspx, ashx能直接处理HTTP请求,它们都实现了IHttpHandler接口。它们能处理HTTP请求也因为ASP.NET已经配置过它们。 以下是它们的默认配置:

<httpHandlers>
    <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>
    <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="true"/>
</httpHandlers>

有趣的是:PageHandlerFactory和SimpleHandlerFactory都实现了IHttpHandlerFactory2接口,因此,它们都可以根据要请求的路径创建一个IHttpHandler实例

  在MapHttpHandler事件前调用HttpContext.RemapHandler(),将会直接影响后面的映射过程, 或者说,我们可以直接指定一个HttpHandler,而不是让ASP.NET来替我们来决定,即修改了路由
3.2 *.ashx下的IsReusbale属性不起作用
 IHttpHandler实例下的IsReusable属性定义HttpHandler类型是否被重用,*.ashx的请求交给SimpleHandlerFactory来创建相应的HttpHandler对象, 然而当ASP.NET调用SimpleHandlerFactory.GetHandler()方法时, 该方法会直接创建并返回我们实现的类型实例。 换句话说:SimpleHandlerFactory根本不使用IHttpHandler.IsReusable的属性,因此,这种情况下,想重用ashx的实例是不可能的事,所以IsReusable能否被重用是由IHttpHandlerFactory决定的,类似的还有*.aspx
除了上述原因外,Page的IHttpHandler的IsReusable值为False,即微软不允许Page重用
   
http://www.cnblogs.com/fsjohnhuang/archive/2012/07/12/2587658.html 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值