学习IIS & MVC的运行原理
我一直疑惑于以下问题,从客户端发出一个请求,请求到达服务器端是怎样跟iis衔接起来的,而iis又是怎样读取我发布的代码的,并返回服务器上的文件。这其中是怎样的一个处理过程。
1:当你从浏览器中输入一个地址或点击一个链接开始,你就已经发出了一个http请求(会根据请求者请求的主机头或者IP或者端口号来找到对应的站点);
2:根据http协议,当请求到达相应的主机服务器时,由服务器上的系统进程http.sys(可以理解为专门处理http请求的进程)接收;
3:http.sys接收到请求信号后,传递给应用程序池的工作者进程,即IIS进程 inetinfo.exe,注意:这时候服务器进程与IIS衔接起来了。
IIS进程可以处理一般的静态页面如.html,处理完后直接将找到的html页面返回到客户端显示;
4:如果是.aspx 或cshtml等页面,IIS不能直接处理,这时,IIS进程会加载一个叫aspnet_isapi.dll;
5:当ISAPI收到处理请求后,会启动一个ASP.NET工作进程,然后将请求信息转交给ASP.NET工作进程(ASPNET_WP.EXE),注意:这时候IIS与ASP.NET衔接起来了。接下来,控制权由ASPNET_WP掌握。
【 我们先来了解下APPDOMAIN是什么, 感觉这篇不错http://allanpie.blog.163.com/blog/static/21320410200921311273632/, 我理解APPDOMAIN就是一个能够处理 aspnet进程(.dll)的环境或应用程序域,我们知道ASP.NET程序的运行需要以.NET Framework为基础平台,通过CLR(公共语言运行库)托管才能运行。ASP.NET是一个复杂的使用托管代码来从头到尾处理Web请求的引擎.
APPDOMAIN中有几个重要的对象。
ISAPIRUNTIME:专门负责解出http请求的必要信息,它将信息和请求转交给HttpRuntime。
HttpRunTime:主要的工作便是为每一个提出请求的客户建立一个HttpContext对象.这个东东又管理着HttpSession对象.
每一个访问者有各自的HttpContext对象和HttpSession对象,这些对象,你可以在.NET FRAMEWORK库中找到对应的类名,像System.Web.HttpContext,System.Web.
HttpSessionState等.这两个对象是APPDOMAIN运行环境的一部分。这两个类的全称为System.Web.Hosting.ISAPIRuntime,System.Web.HttpRuntime。】
6:当控制权交给ASPNET_WP进程掌握后,如果没有执行.net的环境,会先建立APPDOMAIN执行应用程序域,在APPDOMAIN建立时, ISAPIRUNTIME和HttpRuntime这两个类会作为APPDOMAIN的一部分被实例化。
7:当APPDOMAIN初始化完成后,接下来就需要建立会话,将请求传递给其中的一个类HttpRunTime,他们之间的创建关系是:HttpRuntime负责创建HttpContext和HttpSession,
httpContext负责管理httpSession。
从提交http请求开始一直到这(HttpRuntime创建完httpContext为止),实际上,我们在服务器上发布的应用程序仍然没有运行,或者说,请求者的请求实际上并未真正的被处理,前面的工作都是些准备性或者辅助性的工作.
8:接下来,HttpRuntime除了负责创建HttpContext和HttpSession外,还要创建了一个重要的对象HttpApplication.
HttpApplication调用ProcessRequest方法来处理用户请求,具体说就是创建一个HttpContext实例,
9:HttpRuntime使用上下文信息查找或新建能处理该请求的WEB应用程序的对象。由HttpApplication Factory负责返回HttpApplication实例。HttpApplication对象使用IHttpHandlerFactory类型的实例 返回HttpHandler(http处理程序)给HttpRuntime对象。一个页面只是个http处理程序对象。
最后由HttpRuntime对象调用IHttpHandler的页面对象的ProcessRequest方法。HttpHandler根据用户请求文件的扩展名处理请求,并把请求的结果,也就是HTML发送到客户浏览器.
在MVC源码中MvcHandler类继承了接口IHttpHandler,并实现了ProcessRequest(HttpContext httpContext)方法,该方法是MVC程序运行的入口。
10:此时,很想知道mvc中的路由是如何跟HttpApplication联系起来的呢,UrlRoutingModule 如何截获HttpApplicatioin的管道事件,从而把Http Request 引入Mvc框架中的。
在UrlRoutingModule.cs文件中,看到当UrlRoutingModule初始化并调用Init方法的时候注册了 HttpApplication的 PostResolveRequestCache管道事件,所以当HttpAplication对象(这里是MvcApplication)执行时就会触 发PostResolveRequestCache事件,从而把HttpRequest引导进MVC module中
在ASP.NET MVC程序中首先涉及的部件是UrlRoutingModule,它是System.Web.Routing的一部分。UrlRoutingModule 用于第一次检查请求的url和本地磁盘中的文件是否相匹配。如果匹配,UrlRoutingModule会将请求直接回发给IIS,IIS根据地址来进行 相应处理。如果UrlRoutingModule没有在磁盘中找到匹配的文件。它会检查RouteCollection结构来决定是否继续传递请 求.UrlRoutingModule会引入RouteHandler和匹配的路径入口(默认情况下是MvcRouteHandler)。而后会引入合适 的HttpHandler来处理和请求有关的逻辑。默认情况下,这个HttpHandler会是MvcHandler.
11:URL Routing组件是如何与ASP.NET MVC框架组合起来的。
在第一次启动mvc程序的时候,在Application_Start函数中注册路由 RegisterRoutes(RouteTable.Routes);在routes.MapRoute(…)函数中,将自定义的路由规则注册到 System.Web.Routing 组件中, Route route = new Route(url, new MvcRouteHandler())
注:在处理该请求时将由 HttpApplication 类执行以下事件。希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。
对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest 和脚本侵入概述。
如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。
引发 BeginRequest 事件。
引发 AuthenticateRequest 事件。
引发 PostAuthenticateRequest 事件。
引发 AuthorizeRequest 事件。
引发 PostAuthorizeRequest 事件。
引发 ResolveRequestCache 事件。
引发 PostResolveRequestCache 事件。
根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
引发 PostMapRequestHandler 事件。
引发 AcquireRequestState 事件。
引发 PostAcquireRequestState 事件。
引发 PreRequestHandlerExecute 事件。
为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。
引发 PostRequestHandlerExecute 事件。
引发 ReleaseRequestState 事件。
引发 PostReleaseRequestState 事件。
如果定义了 Filter 属性,则执行响应筛选。
引发 UpdateRequestCache 事件。
引发 PostUpdateRequestCache 事件。
引发 EndRequest 事件。
当我们对asp.net mvc网站发出一个请求的时候,会发生5个主要步骤:
步骤1:创建routetable 当asp.net应用程序第一次启动的时候才会发生第一步。routetable把url映射到handler。
步骤2:urlroutingmodule拦截请求 第二步在我们发起请求的时候发生。urlroutingmodule拦截了每一个请求并且创建和执行合适的handler。
步骤3:执行mvchandler mvchandler创建了控制器,并且把控制器传入controllercontext,然后执行控制器。
步骤4:执行控制器 控制器检测要执行的控制器方法,构建参数列表并且执行方法。
步骤5:调用renderview方法 大多数情况下,控制器方法调用renderview()来把内容呈现回浏览器。controller.renderview()方法把这个工作委托给某个viewengine来做。
这些知识及图片都是参考下面的博文总结来的,方便查看
学习IIS & MVC的运行原理的更多相关文章
- 学习IIS & MVC的运行原理 (转)
我一直疑惑于以下问题,从客户端发出一个请求,请求到达服务器端是怎样跟iis衔接起来的,而iis又是怎样读取我发布的代码的,并返回服务器上的文件.这其中是怎样的一个处理过程. 1:当你从浏览器中输入一个 ...
- Cocos2d-x 学习笔记(9) Action 运行原理
1. 从一个Action开始 1.1 创建 在Scene里写一个Sprite,并添加Action: Sprite *sp = Sprite::create("m1.png"); M ...
- ASP.NET的运行原理与运行机制 如何:为 IIS 7.0 配置 <system.webServer> 节
https://technet.microsoft.com/zh-cn/sysinternals/bb763179.aspx 当一个HTTP请求到服务器并被IIS接收到之后,IIS首先通过客户端请求的 ...
- .NET CORE学习笔记系列(5)——ASP.NET CORE的运行原理解析
一.概述 在ASP.NET Core之前,ASP.NET Framework应用程序由IIS加载.Web应用程序的入口点由InetMgr.exe创建并调用托管,初始化过程中触发HttpApplicat ...
- IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转
转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 前言: 记录 IIS 相 ...
- IIS Web 服务器/ASP.NET 运行原理基本知识概念整理
前言: 记录 IIS 相关的笔记还是从公司笔试考核题开始的,问 Application Pool 与 AppDomain 的区别? 促使我对进程池进了知识的学习,所以记录一下学习 ...
- springboot深入学习(二)-----profile配置、运行原理、web开发
一.profile配置 通常企业级应用都会区分开发环境.测试环境以及生产环境等等.spring提供了全局profile配置的方式,使得在不同环境下使用不同的applicaiton.properties ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- 传智播客学习之Android运行原理 (转)
传智播客学习之Android运行原理 (2010-03-20 22:45:15) 转载▼ 今天终于忙里偷闲,和大家探讨一下android技术,第一次听到3G应该追溯到大学三年级的时候了,记得当时现代通 ...
随机推荐
- poj3254(状态压缩DP)
poj3254 题意 给出一个01矩阵,1表示当前这个位置可以放牛,要求放牛的方案保证牛不能左右或上下相邻,求方案数. 分析 dp[S][i]: 表示到 i 行时的状态S(用二进制数表示),那么状态转 ...
- JSK 11: 移除数组中的重复元素
题目描述 给定一个升序排列的数组,去掉重复的数,并输出新的数组的长度. 例如:数组 $A = \{1, 1, 2\}$,你的程序应该输出 $2$ 即新数组的长度,新数组为 $\{1, 2\}$. 要求 ...
- hdu 4826 Labyrinth DP
题目链接:HDU - 4826 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向 ...
- IntelliJ debug grails 无效的解决办法
从Grails 2.2以后默认run-app命令将启动Grails应用程序在一个单独的Java虚拟机. 这就是所谓的分叉的Tomcat Grails中的执行. 这样的类路径Grails构建系统和应用程 ...
- rpm安装、卸载、升级、查询和验证
RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件.Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RP ...
- 【spring boot】spring boot 2.0 项目中使用mysql驱动启动创建的mysql数据表,引擎是MyISAM,如何修改启动时创建数据表引擎为【spring boot 2.0】
默认创建数据表使用的引擎是MyISAM 2018-05-14 14:16:37.283 INFO 7328 --- [ restartedMain] org.hibernate.dialect.Dia ...
- PowerPoint在线浏览的几个方案
思路:将ppt转换成pdf.image后实现在线浏览功能 下面的解决方案均不用在服务器端安装office 一.找到一个收费的restful接口,测试可用 http://www.convertapi.c ...
- easyui 放大镜图标
iconCls:search 对应的 easyui的查询图标忒丑 想用放大镜图标 iconCls:zoom 找半天找到放大镜图标的 然后去icon.css文件中查 发现这个样式就叫zoom.
- [置顶]
kubernetes资源类型--Service
为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持.K8S中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构. 实现原理 S ...
- python 小技巧(glob,guid,序列化,压缩字符,有序字典,sorted函数,分片)
1.glob模块 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:”*”, “?”, “[]”.”* ...