MVC源码解析 - 进入CLR
这一篇是转载自汤姆大叔的一篇随笔.
IIS 5 的 ASP.net 请求处理过程
IIS5核心特征是:IIS是允许在一个叫InetInfo.exe的进程上的,所以无论是aspx页面还是html页面都是通过这个进程处理的,其中,由于aspx页面扩展名映射到了aspnet ISAPI.DLL上,所以如果页面是aspx的话,aspnet ISAPI.DLL则创建aspnet_wp这个Worker Process,并在初始化的时候加载CLR,所以这是一个托管的环境。
需要注意的几点是:
- 同一台服务器只能运行一个 aspnet_wp 进程,也就是说所有的ASP.NET Web Application都在同一个Worker Process 中,但是不意味着他们共享同一个context和数据库, ASP.NET里有个AppDomain的概念,每个站点或虚拟目录都对应一个单独的AppDomain,每个AppDomain是隔离的,有自己独立的context上下文,所以安全没问题,所以我们的结论是:ASP.NET程序是继续AppDomain的,而不是基于Process的。
- ASP.NET ISAPI 不但负责创建 aspnet_wp Worker Process,而且负责监控该进程,如果检测到 aspnet_wp 的 Performance 降低到某个设定的下限,ASP.NET ISAPI 将结束掉该进程,在Request来了以后,ASP.NET ISAPI 将重新创建新的 aspnet_wp Worker Process。
- 由于 IIS 和 Application 运行在他们各自的进程中,他们之间的通信必须采用特定的通信机制。由于之间的通信是同机器不同进程的通信(local interprocess communications),处于Performance的考虑,他们之间采用基于Named pipe的通信机制。ASP.NET ISAPI和Worker Process之间的通信通过他们之间的一组Pipe实现。同样处于Performance的原因,ASP.NET ISAPI 通过异步的方式将Request 传到Worker Process 并获得 Response,但Worker Process 则是通过同步的方式向 ASP.NET ISAPI 获得一些基于 Server 的变量。
IIS 6 的 ASP.net 请求处理过程
IIS6和IIS5有3个非常不同的地方:接受请求(Http.sys),应用程序池(Application Pool),w3wp.exe Worker Process。
在IIS5里,InetInfo.exe附件监听并处理请求(Request),但在IIS6里,服务器是通过一个新组件Http.sys来接受请求(Request)。
Http.sys接收到http请求的时候,它会根据IIS中的 Metabase 查看该基于该 Request 的 Application 属于哪个Application Pool, 如果该Application Pool不存在,则创建之。否则直接将 request 发到对应Application Pool 的 Queue中。
每个 Application Pool 对应着一个Worker Process:w3wp.exe。在IIS Metabase 中维护着 Application Pool 和worker process的Mapping。WAS(Web Administrative service)根据这样一个mapping,将存在于某个Application Pool Queue的request 传递到对应的worker process(如果没有,就创建这样一个进程)。在 worker process 初始化的时候,加载ASP.NET ISAPI,ASP.NET ISAPI 进而加载CLR。
注意:IIS5和IIS6还有一个区别是,在IIS5里ASP.NET ISAPI创建aspnet_wp Worker Process,进而加载CLR,但在IIS6里是w3wp通过Application Pool的map关系运行以后,才加载ASP.NET ISAPI,然后加载CLR。
IIS 7 的 ASP.net 请求处理过程
步骤 1 到 6 ,是处理应用启动,启动好后,以后就不需要再走这个步骤了,上图的8个步骤分别如下:
- HTTP.sys监听拦截客户端请求开始处理。
- HTTP.sys通过配置信息联系WAS获取相关信息。
- WAS 向配置存储中心请求配置信息。applicationHost.config。
- WWW 服务接受到配置信息,配置信息指类似应用程序池配置信息,站点配置信息等等。
- WWW 服务使用配置信息去配置 HTTP.sys 处理策略。
- WAS为这个请求对应的应用程序池(Application Pool)开启W3WP Worker Process。
- W3WP Worker Process处理以后,将Response返回给HTTP.sys。
- 客户端接受到Response内容。
W3WP.exe 进程中又是如果处理得呢?? 取决于IIS 7 的应用程序池托管管道模式是什么,IIS7目前有2个模式: 经典模式和集成模式。两种模式下的处理方式是不一样,看如下区别:
IIS7经典模式:
IIS7的经典模式和IIS6的处理方式是一样的,用户发送HTTP Request请求以后, IIS会先行处理,IIS会根据HTTP Request的类型进行筛选,如果是HTML 静态网页就由 IIS 自行处理,如果不是,就根据具体要求的内容类型,分派给各自的 IIS ISAPI extension;如果要求的内容类型是 ASP.NET,就分派给负责处理 ASP.NET 的 IIS ISAPI extension,也就是 aspnet_isapi.dll,然后再进入CLR。
IIS7集成模式:
IIS7集成模式是一个伟大的改进,已经预加载了CLR(不在依靠之前IIS版本的aspnet_ISPAI.DLL),也就是说所有的HTTP Request请求都要经过ASP.NET来处理(包括html, php等),也因为 ASP.NET 的诸多功能已经成为 IIS 7 的一部份,因此 ASP 程序、PHP 程序或静态 HTML 网页等类型的要求,也能使用像是Forms认证(Forms Authentication)或输出缓存(Output Cache)等 ASP.NET 2.0 的功能(但须修改 IIS 7 的设定值),也因为 IIS 7 允许自行以 ASP.NET API 开发并加入模块,因此 ASP.NET 网页开发人员将更容易扩充 IIS 7 和网站应用程序的功能,甚至能自行以 .NET 编写管理 IIS 7 的程序(例如以程控 IIS 7 以建置网站或虚拟目录)。
总结:
不同的IIS版本进入CLR的方式是不一样的,其中IIS版本之间最大的改变时:
- IIS5 到 IIS6 的改进,主要是 HTTP.sys 的改进。
- IIS6 到 IIS7 的改进,主要是 ISAPI 的改进。
转自:
MVC源码解析 - 进入CLR的更多相关文章
- MVC源码解析 - 目录
尽管MVC6和MVC4,5已经有很大不同, 但是, 作为一个普通开发人员, 还真没有资格去选择使用哪个版本. So, 尽管已经是old的版本, 还是再次花点时间去温故知新. 我记得在15年初的时候, ...
- MVC源码解析 - UrlRoutingModule / 路由注册
从前面篇章的解析, 其实能看的出来, IHttpModule 可以注册很多个, 而且可以从web.config注册, 可以动态注册. 但是有一个关键性的Module没有讲, 这里就先来讲一下这个关键性 ...
- MVC源码解析 - HttpRuntime解析
先看一张图, 从这张图里, 能看到请求是如何从CLR进入HttpRuntime的. 一.AppManagerAppDomainFactory 看到这张图是从 AppManagerAppDomainFa ...
- MVC源码解析 - Http Pipeline 解析(上)
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); 上一篇说到了创建 ...
- MVC源码解析 - 配置注册 / 动态注册 HttpModule
本来这一篇, 是要继续 Pipeline 的, 但是在 Pipeline之前, 我看到了InitModules()方法, 所以决定, 在中间穿插一篇进来. 这一篇来讲一下 IHttpModule 的加 ...
- spring mvc源码解析
1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...
- MVC源码解析 - Http Pipeline 解析(下)
接上一篇, 我在 HttpModule 的Init方法中, 添加了自己的事件, 在Pipeline里, 就会把握注册的事件给执行了. 那么Pipeline是如何执行并且按照什么顺序执行的呢? 现在我们 ...
- 深入了解SpringMVC源码解析
Spring MVC源码解析 Spring MVC的使用原理其实是通过配置一个Servlet来接管所有的请求,所有的请求由这个Servlet来进行分发处理. 我们可以从web.xml里面看出这一点 & ...
- spring MVC cors跨域实现源码解析
# spring MVC cors跨域实现源码解析 > 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就 ...
随机推荐
- jquery 拖动DIV
<html><head> <style type="text/css"> .show{ background:#7cd2f8; width:30 ...
- 用HTML和javascript(JS)计算触屏手机手指滑动方向的演示
移动终端的流行,程序员希望通过HTML+JS完成触屏动作的识别.下面给出具体实现的例子,供大家参考. 将下面的代码复制并保存,用手机访问,现在的手机浏览器一般都支持触屏,针对本演示来讲就是支持三个js ...
- KMP算法简单回顾
前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...
- 根据首尾字节的tcp分包断包算法
这个算是我的一点小总结吧,放出来分享给大家,原来在网上找这种算法都找了N久没找到,自己写也是走了许多弯路,就放出来遛一遛吧 大家将就这个看看, 这是其中的一个主要的方法,其余的我就不放出来了,其中的I ...
- Jenkins Slave 设置
Jenkins Slave node环境变量设置有很多trap,在最近的工作当中,我把slave部署在red hat linux 上,进行c++项目的编译部署和发布,但是在执行工程的时候,总会报出某些 ...
- Essential C#读书笔记
Essential C#读书笔记 这是一个多变的时代,一次又一次的浪潮将不同的人推上了巅峰.新的人想搭上这一波,同时老的人也不想死在沙滩上.这些年新的浪潮又一次推开,历史不停地重复上演,那便是移动互联 ...
- web 富文本编辑器总结
前言 富文本编辑器,就是除了能输入不同的文本之外,还可以之间粘贴图画等其他的多媒体信息.也可说是所见即所得的编辑器. 目前可以使用的编辑器有很多, 在网络上有找到这样一份比较表格: 编辑器 产地 稳定 ...
- 模板方法(Template)模式
模板方法(Template)模式 前言 前段时间在亚马逊买了一本<CLR>的书,当时搞活动买一送一,然后挑了一本<漫谈设计模式>,一位不相识的大牛写的,这几天闲来无事,翻了几页 ...
- How To Configure Logging And Log Rotation In Apache On An Ubuntu VPS
Introduction The Apache web server can be configured to give the server administrator important info ...
- c++ virtual function 虚函数面试题
下面的代码输出什么? #include<iostream> using namespace std; class A { public: virtual void foo() { cout ...