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
欢迎添加个人微信号:Like若所思。
欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!
ASP.NET开发实战——(四)ASP.NET MVC是如何运行的?它的生命周期是什么?的更多相关文章
- ASP.NT运行原理和页面生命周期详解及其应用
ASP.NT运行原理和页面生命周期详解及其应用 1. 下面是我画的一张关于asp.net运行原理和页面生命周期的一张详解图.如果你对具体不太了解,请参照博客园其他帖子.在这里我主要讲解它的实际应用. ...
- ASP.NET开发实战——(二)为什么使用ASP.NET
本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...
- ASP.NET运行时详解 生命周期入口分析
说起ASP.NET的生命周期,网上有很多的介绍.之前也看了些这方面的博客,但我感觉很多程序猿像我一样,看的时候似乎明白,一段时间过后又忘了.所以,最近Heavi花了一段时间研究ASP.NET的源代码, ...
- ASP.NET开发实战——(九)ASP.NET MVC 与数据库之ORM
之前的文章中介绍了如何在ASP.NET中通过ADO.NET操作SQL Server和My SQL数据库,数据库的操作是通过SQL语句的执行来完成的,在ASP.NET中还有一个简便的方式来使用数据库,那 ...
- ASP.NET开发实战——(五)ASP.NET MVC & 分层
上一篇文章简要说明了MVC所代表的含义并提供了详细的项目及其控制器.视图等内容的创建步骤,最终完成了一个简单ASP.NET MVC程序. 注:MVC与ASP.NET MVC不相等,MVC是一种开发模式 ...
- ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL
之前介绍了My Blog如何使用ADO.NET来访问SQL Server获取数据.本章将介绍如何使用My SQL来完成数据管理. 在使用My SQL之前需确保开发环境中安装了My SQL数据库和Con ...
- ASP.NET开发实战——(六)ASP.NET MVC & 分层 代码篇
上一篇文章对如何规范使用ASP.NET进行了介绍,本章内容将根据上一篇得出的结论来修改博客应用的代码. 代码分层 综合考虑将博客应用代码分为以下几个层次: ○ 模型:代表应用程序中的数据模型,与数据库 ...
- ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF
之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...
- ASP.NET开发实战——(十二)ASP.NET MVC 与数据库之Entity Framework Migrations
在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...
随机推荐
- windows下mysql安装和配置
历史版本下载地址安装,解压添加环境变量使用cmd中操作mysql进程修改mysql的配置附录:设置mysql随开机自启 TOC 历史版本下载地址 windows的mysql历史版本,推荐使用5.6版本 ...
- EF Core 根据已有的数据库来生成 EF 领域模型
1. 如图: 2. 命令 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrame ...
- Linux RAID 磁盘管理
Linux RAID 磁盘管理 RAID工作模式介绍:https://www.cnblogs.com/xiangsikai/p/8441440.html 本章主要讲解 Linux下 RAID5 与 R ...
- UWP 推荐 - 限时免费的RSS阅读器《RSS 追踪》登录 Windows 10
文/云之幻 前不久,博客作者 Bravo Yeung 写了一篇还算略受欢迎的关于 RSS 的文章 .Net开发者必知的技术类RSS订阅指南. RSS 现在用的人很少了,而且就算是我,也不过是在一周前才 ...
- CentOS7系统yum方式安装MySQL5.7
参考:https://www.cnblogs.com/bigbrotherer/p/7241845.html#top 1.在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要, ...
- 【机器学习笔记】ID3构建决策树
好多算法之类的,看理论描述,让人似懂非懂,代码走一走,现象就了然了. 引: from sklearn import tree names = ['size', 'scale', 'fruit', 'b ...
- .Net MVC 提示未能加载文件或程序集
最近在开发.Net MVC程序时,突然出现未能加载文件或程序集的错误, 错误1 错误2 猜测时由于引用了Swagger,导致Swagger依赖的组件版本和现有版本冲突(现在仍未确定是这个原因),浪费了 ...
- 写一个操作 .ini文件的类
class IniHelp { private string iniPath; [DllImport("kernel32")] private static extern long ...
- 使用T4模板同时生成多个类文件
代码: <#@ template language="C#" debug="false" hostspecific="true"#&g ...
- 2019-07-23 类的继承和final关键字的应用
我们称以存在的用来派生新类的类为基类,又称做父类,超类.由已存在的类派生出的新类称为派生类,又称为子类.从一个基类派生的继承称单继承,从多个基类派生的继承称为多继承.也就是说:一个类只能直接从一个类中 ...