ASP NET MVC处理过程
- Windows内核模块HTTP.SYS监听到网络请求,分发给W3SVC
IIS6引入,以驱动形式运行运行在Windows内核模式下,它是Windows 2003 的TCP/IP网络子系统的一部分,从结构上看它属于TCP上的一个网络驱动程序。他已经不属于IIS范畴,它的配置信息没有在IIS的元数据库(Metabase)中,而是定义在注册表。
HTTP.SYS优点:
持续监听:网络驱动程序,始终保持运行态,对用户HTTP请求及时响应
更好稳定性:内核模式下,不执行用户代码,所以本身不会受到Web应用、工作进程、IIS进程的影响
内核模式缓存:某资源频繁请求,HTTP.SYS会把相应内容缓存,后续请求直接响应。基于内核模式的缓存,不会和用户模式切换,响应速度极大改进 - W3SVC(World Wide Web Publishing Service)接收请求,传递给WAS
IIS6中承载三大功能:接收HTTP请求、配置管理、进程管理。IIS7中后两种功能分配给了WAS - WAS通过内置配置管理模块加载相关配置信息,并对相关组件进行配置,创建工作进程(w3wp.exe World Wide Web Work Process)
WAS功能:
配置管理:从元数据库(Metabase)中加载配置信息对相关组件进行配置
进城管理:创建、监视、回收工作进程
IIS5.x和IIS6.X基于Metabase的配置信息存储不同,IIS7.0将配置信息存放在XML形式的配置文件中
WAS引入为IIS提供了对非HTTP协议的支持。WAS通过监听器适配器接口(Listener Adapter Interface)抽象出针对不同协议的监听器。除了基于网络驱动HTTP.SYS提供HTTP请求监听功能外还有TCP监听器、命名管道监听器、MSMQ监听器,以提供基于TCP、命名管道、MSMQ传输协议的监听支持。3中监听器对应三种监听适配器。
IIS7中W3SVC更多的为HTTP.SYS起着监听适配器的作用。另外三种监听器和监听适配器以Windows服务形式体现,在服务控制管理器中可以找到。(详情MVC框架揭秘P17)
W3SVC接收到的HTTP请求还是WCF提供的监听适配器接收到的请求都会传递给WAS - 工作进程w3sp.exe中,它利用aspnet_isapi.dll加载.NET运行时(已加载不重复加载),创建对应Web应用的应用程序域(第一次请求时创建)
- 一个特殊运行时IsapiRuntime(System.Web.Hosting.dll )加载接管HTTP请求,创建IsapiWorkerRequest对象,用于封装当前HTTP请求,并将IsapiWorkerRequest对象传递给ASP.NET运行时的HttpRuntime
- 传递给HttpRuntime后正式进入ASP.NET管道。HttpRuntime根据IsapiWorkerRequest创建表示当前HTTP请求的上下文HttpPContext对象。HttpRuntime利用HttpApplicatinFactory创建新的或获取现有的HttpApplication对象。
ASP.NET维护了一个HttpApplication对象池,HttpApplicationFactory从池中可用的HttpApplication中选取一个用于处理HTTP请求,处理完毕后放回对象池。HttpApplication负责处理当前HTTP请求
HttpApplication初始化的过程中,会根据配合文件加载并初始化相应的HttpModule对象。对于HttpApplication来说,在它处理HTTP请求的不同阶段触发不同的事件,而HttpModule的意义在于通过HttpApplication的相应事件,将所需要的操作注入HTTP请求的处理流程。
最终完成HTTP请求的处理实际在HttpHandler中。不同资源类型,具有不同的HttpHandler(.aspx:System.Web.UI.Page ;.svc:System.ServiceModel.Activation.HttpHandler)
BeginRequest | 开始 | HTTP管道开始处理请求时 ,会触发BeginRequest事件 |
AuthenticateRequest PostAuthenticateRequest |
请求的身份验证 | ASP.NET先后触发这两个事件 ,使安全模块对请求进行身份验证 |
AuthorizeRequest PostAuthorizeRequest |
进程授权 | ASP.NET先后触发这两个事件 ,使安全模块对请求进程进行授权 |
ResoleRequestCache PostResoleRequestCache |
查询缓存 | ASP.NET先后触发这两个事件 ,以使缓存模块利用缓存的内容直接响应请求 |
PostMapRequestHandler | 匹配Handler | 对于访问不同的资源类型 ,ASP.NET具有不同的HttpHandler对其进行处理。 对于每个请求,ASP.NET会通过扩展名选择匹配响应的HttpHandler类型 ,成功匹配后,该实现被触发 |
AcquirRequestState PostAcquirRequestState |
获取请求状态 (如Session) |
ASP.NET先后触发这两个事件 ,使状态管理模块获取基于当前请求相应的状态,如SessionState |
PreRequestHandlerExcute PostRequestHandlerExcute |
处理请求 | ASP.NET最终通过与请求资源类型相对应的HttpHandler处理请求 ,实行HttpHandler前后,这两个实现被触发 |
ReleaseRequestState PostReleaseRequestState |
释放请求状态 | ASP.NET先后触发这两个事件 ,使状态管理模块释放基于当前请求的状态 |
UpdateRequestCache PostUpdateRequestCache |
写入输出缓存 | ASP.NET先后触发这两个事件 ,以使缓存模块将HttpHandler处理结果保存在输出缓存中 |
LogRequest PostLogRequest |
记录日志 | ASP.NET先后触发这两个事件为当前请求进行日志记录 |
EndRequest | 结束 | 整个请求处理完成后,EndRequest事件被触发 |
其他阅读1
参考: ASP.NET MVC4 框架揭秘