ASP.NET没有魔法——ASP.NET MVC是如何运行的?它的生命周期是什么?
前面的文章我们使用ASP.NET MVC创建了个博客应用,那么它是如何工作的呢?我们都知道ASP.NET的程序需要部署到IIS上才能够通过浏览器来访问,那么IIS与ASP.NET MVC程序之间又是如何工作的呢?
本章将从以下几个方面对ASP.NET的运行周期进行介绍:
●IIS及其管道配置
●HttpApplication Events
●使用Global.asax注册事件
IIS及其管道配置
IIS(Internet Information Services)是微软在Windows操作系统上提供的一款用于发布互联网服务的软件,它除了可以作为Web服务器以外还可以用于FTP服务器、NNTP服务器和SMTP服务器。本章内容将介绍它作为Web服务器时如何运行ASP.NET程序。
IIS的Web服务器有两种模式一种是经典模式,经典模式是IIS6.0之前版本支持的模式,另一种是集成模式,集成模式是IIS7.0以上的默认模式。它们之间主要的区别是经典模式只能使用C++等非托管的原生语言编写HttpModule来对IIS进行扩展,而集成模式除了非托管语言外还.Net Framework托管的语言来编写拓展。
而且对于IIS的经典模式来说,ASP.NET仅仅是IIS的一个ISAPI拓展,通过在IIS中配置映射来决定当前请求使用哪个拓展来处理,ASP.NET的请求以及静态文件请求的处理程序是不同的,它们处理的过程如下图所示:

从上图中可以看出IIS接收到HTTP请求,这个请求经过了IIS和asp.net两个管道处理后返回响应到客户端,所以ASP.NET中的Forms验证、Windows验证等功能没法对于静态文件使用。
而IIS的集成模式改变了这一现状,在集成模式中,对于HTTP请求,IIS和ASP.NET的处理管道进行了合并,IIS复制接收所有的请求,所有请求都将经过这个被“合并”后的管道处理。这样所有的请求包括静态文件都可以经过身份验证等处理。如下图所示:

上面介绍了IIS处理HTTP请求时是通过HttpModule来对请求通道完成拓展的,换句话说,如果需要新的功能那么也可以添加一个HttpModule在通道中即可,那么要如何对请求管道进行配置呢?web.config文件。
在IIS的集成模式中,配置文件已经被统一了,通过web.config文件来对参与请求管道的HttpModule配置即可:

上图所示是创建一个ASP.NET MVC程序时,web.config文件自动添加了一个名为ApplicationInsightsWebTracking的HttpModule,这个HttpModule的功能是用来追踪监测请求数据的。
另外在<system.web>节点下还有一个<httpHandlers>节点用于映射请求对应的处理器。
IIS除了加载应用的web.config之外还会通过继承机制“加载”服务器级别的配置文件:
● 服务器级别的Machine.config,该文件位于systemroot\Microsoft .NET\Framework\versionNumber\CONFIG\Machine.config,它包含了ASP.NET配置节点的默认值。

● 根网站级别的web.config,该文件位于systemroot\Microsoft .NET\Framework\versionNumber\Config\web.config,它提供了大部分的system.web章节的配置,如HttpHandler以及HttpModule:


从上面的配置可以看到,ASP.NET的默认配置已经帮助开发者完成了很多的工作,开发者只需要根据实际需求在网站级别的web.config中删除不需要的或添加新的配置即可。
以下是新建一个ASP.NET MVC应用运行时的HTTP Module(部分):

HttpApplication Events
在IIS的集成模式下,由于ASP.NET的请求处理管道已经与IIS通道相连接,所以处理请求的整个通道的每一个步骤都以事件的方式暴露给了HttpApplication对象。
注:上图为部分事件处理器。
根据执行顺序排序:
1. BeginRequest 事件.
2. AuthenticateRequest 事件.
3. PostAuthenticateRequest 事件.
4. AuthorizeRequest 事件.
5. PostAuthorizeRequest 事件.
6. ResolveRequestCache 事件.
7. PostResolveRequestCache 事件.
8. MapRequestHandler 事件. 根据请求文件的拓展名来选择一个适合的处理器,这个处理器可以是非托管代码编写的模块如StaticFileModule或者是托管代码的模块如PageHandlerFactory(它用来处理.aspx文件).
9. PostMapRequestHandler 事件.
10. AcquireRequestState 事件.
11. PostAcquireRequestState 事件.
12. PreRequestHandlerExecute 事件.
13. 调用处理器的ProcessRequest方法 (或者是异步版本的).
14. PostRequestHandlerExecute 事件.
15. ReleaseRequestState 事件.
16. PostReleaseRequestState 事件.
17. 如果定义了过滤器则执行过滤器对相应信息进行过滤.
18. UpdateRequestCache 事件.
19. PostUpdateRequestCache 事件.
20. LogRequest 事件.
21. PostLogRequest 事件.
22. EndRequest 事件.
23. PreSendRequestHeaders 事件.
24. PreSendRequestContent 事件.
使用Global.asax注册事件
在ASP.NET程序中可以通过Global.asax文件来注册这些事件,一般创建ASP.NET应用程序项目时将会自动创建一个Global.asax文件,比如MVC应用中的Global.asax:

MvcApplication继承与HttpApplication类型,在这个类型中可以通过一个特殊的方法命名方式Application_{eventName}来注册事件,比如Application_BeginRequest,这种注册事件方法适用于上面的所有事件,另外Application_Start和Application_End是特殊的方法,不被包含于上面的事件中。
以下是部分注册事件代码:

大部分方法:

使用一个Action来测试事件的执行:

访问这个action的执行结果:
小结:
本章介绍了IIS经典模式和集成模式对请求的处理流程,并对HTTP Module和 HTTP Handler的配置进行了说明,最后通过代码的方式实现了HttpApplication生命周期的事件的注册和使用。
参考:
https://msdn.microsoft.com/en-us/library/bb470252.aspx
https://docs.microsoft.com/en-us/iis/application-frameworks/building-and-running-aspnet-applications/aspnet-integration-with-iis
https://msdn.microsoft.com/en-us/library/ms178685.aspx
https://weblog.west-wind.com/posts/2009/Jun/18/How-do-ASPNET-Application-Events-Work
https://msdn.microsoft.com/en-us/library/ms178473.aspx
本文地址:http://www.cnblogs.com/selimsong/p/7650129.html
ASP.NET没有魔法——ASP.NET MVC是如何运行的?它的生命周期是什么?的更多相关文章
- ASP.NET没有魔法——ASP.NET MVC 与数据库大集合
ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...
- ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...
- ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)
上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染
对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理
ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...
- ASP.NET没有魔法——ASP.NET 身份验证与Identity
前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...
- ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...
随机推荐
- 【Alpha阶段】第四次 Scrum Meeting
每日任务 1.本次会议为第 四次 Meeting会议: 2.本次会议在上午09:35,大课间休息时间在禹州楼召开,召开本次会议为20分钟,分析完善接下来的任务: 一.今日站立式会议照片 二.每个人的工 ...
- 201521123059 《Java程序设计》第一周学习总结
第一周学习总结 1.本周学习总结 开学第周我们开始了JAVA学习,刚开始还有点懵,连熟悉相关的软件都要摸索很久,最后在看老师给的一些教程和课本的情况下安装了JDK和eclipse等软件,并进行了一次实 ...
- JAVA课程设计个人博客 学生成绩管理 201521123001 张陈东芳
1. 团队课程设计博客链接 http://www.cnblogs.com/kawajiang/p/7062407.html 2.个人负责模块或任务说明 我主要负责实现学生信息的添加功能.学生成绩的录入 ...
- JavaSE(十)之Collection总结
前面几篇把集合中的知识大概都详细的说了一遍,但是我觉得还是要总结一下,这样的话,可以更好的理解集合. 一.Collection接口 首先我们要一张图来说明: Collection接口,它是集合的顶层接 ...
- 如何在CentOS上安装一个2048小游戏
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- SIT 和 UAT
在企业级软件的测试过程中,经常会划分为三个阶段--单元测试,SIT和UAT,如果开发人员足够,通常还会在SIT之前引入代码审查机制(Code Review)来保证软件符合客户需求且流程正确.下面简单介 ...
- java最全时间类及用法
对于时间类,这篇主要说明各种现实情况下如何取值,怎么定向取值,得到自己想要的时间参数.在java中时间类主要有Date.Calendar,暂时只介绍 java.util.*下的时间类,对于java.s ...
- [UIKit学习]02.关于UIButton
按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 按钮也是一种容器,在这一点上跟UIView类似 按钮的三种状态 normal(普通状态) 默认情况(Default) 对 ...
- 从输入 URL 到页面加载完成的过程中都发生了什么
从输入 URL 到页面加载完成的过程中都发生了什么 过程描述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理 ...