首页 > 代码库 > .NET 高级架构师0001 一切从源头开始

.NET 高级架构师0001 一切从源头开始

ASP.NET请求处理机制

ASP.NET请求处理机制分为经典形式和集成形式
 
经典形式
经典形式是为了与之前的版本兼容,运用ISAPI扩展来调用ASP.NET运转库,原先运转于IIS6.0下的Web应用程序迁移到IIS7.0中只需将应用程序配置成经典形式,代码根本不用修正就能够正常运转。
 
集成形式
集成形式是一种统一的乞求处置管道,它将ASP.NET恳求管道与IIS中心管道组合在一同,这种形式可以提供更好的性能,可以完成配置和管理的模块化,而且增加了运用托管代码模块扩展IIS时的灵敏性。假设老的Web应用程序运转于IIS7.0的集成形式下,可能需求对应用程序的web.config文件停止修正,特别是运用了完成IHttpHandler接口的自定义模块的状况。IIS7.0在同一个效劳器上可以同时支持两种形式的应用程序。
 
 
 
一、收到一个请求,客户端发送给服务器端
 
二、一个http请求对应一个http报文(http://......)
 
三、http.sys组件获取http请求,转交给iis做处理,过程中,先通过缓存查看是否有缓存,
若有缓存直接从缓存区读取缓存交给iis,没有就响应请求后交给iis。
 
四、服务器iis收到请求后,判断请求的内容是否动静态资源,是静态资源,直接读取;
若是动态资源,处理动态资源,交给查询映射表查找由哪个扩展程序来处理这个请求,一般由aspnet_isapi.dll这个组件进行处理,生成响应请求后读取。
 
五、动态资源 W3WP.exe 会加载  aspnet_isapi.dll 
    当客户端向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请求,处理完毕后将结果返回给客户端。
 
六、NET运行时的加载  .NET Runtime
    如果Web应用程序是第一次加载,那么首先会由aspnet_isapi.dll加载.NET运行时(主要是调用服务器上的.Net Framework创建CLR运行时)。而一个IIS工作进程里有一个应用程序池,其中可以承载多个应用程序域AppDomain。
 
七、应用程序池
    应用程序池就是可以看成装载计算机分配给动态网站的内存的容器
 
八、应用程序域
    使用.NET建立的可执行程序,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.NET引入的一个新概念,它比进程所占用的资源要少,可以被看作是一个轻量级的进程。
 
九、ISAPIRuntme.ProcessRequest()方法是进入ASP.Net的第一个入口,ASP.Net的核心处理部分就刚刚开始。此篇我将其称为前奏,是因为它是在ASP.Net的核心处理部分之前,将HTTP请求一步一步地传递给了ISAPIRuntime对象,后面我们再继续探索ASP.Net的请求处理机制,今天就到此结束!
 

集成形式

微软官方图片
技术分享
        从该生命周期可以看出,集成模式下不管托管代码还是本机代码,都可以在身份验证和执行处理程序被插入到内核代码的托管代码拦截。在IIS6下,要想拦截本机代码,比如Htm文件,需要编写WIN32的非托管代码,但它也保留扩展的ISAPI,我们可以写托管代码拦截托管文件的请求。虽然IIS6也可以通过IIS插入ISAPI为aspnet_isapi.dll的扩展,处理对htm文件的拦截,但它实际会走两个通道,首先是IIS内部的本机代码拦截,然后是托管代码ISAPI的拦截。经典模式就是为了保留和IIS6一样的处理方式,以前开发的代码,可以方便的移植到IIS7上。

      IIS7集成模式还增加了MapRequestHandler、LogRequest 和 PostLogRequest 事件,如果在经典模式下加了这些处理事件,会抛出:此操作要求使用 IIS 集成管线模式。如果集成模式下不让IIS处理不兼容集成模式的配置以及处理方式,可以在web.config中配置:

 <system.webServer>

    <validation validateIntegratedModeConfiguration="false" />

 </system.webServer>即可。

     实际上IIS7集成模式,就是让用户可以通过编写托管代码的handler等,把托管代码插入到IIS内核代码中来解析,方便大家精确控制任意请求,带来更好的扩展性。但缺点呢,我认为集成模式,任何文件请求都可能经过托管代码处理,别人不想把类试图片和静态文件用托管代码处理,就得想其他办法了,这样会不会内部效率降低,但这都是个人观点。

       如果在IIS7集成模式下使到httpmodule拦截静态文件请求,需要在web.server节下设置runAllManagedModulesForAllRequests="true"

.NET 高级架构师0001 一切从源头开始