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若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

原文地址:https://www.cnblogs.com/cool2feel/p/11544452.html

时间: 2024-10-01 07:14:03

ASP.NET开发实战——(四)ASP.NET MVC是如何运行的?它的生命周期是什么?的相关文章

ASP.NET开发实战——(二)为什么使用ASP.NET

本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. 本文从以下几个方面来介绍为什么使用ASP.NET: ●ASP.NET是什么? ●为什么使用ASP.NET? ●博客的需求及实现 ●什么是Web.HTML.Web服务器 ASP.NET是什么? ASP.NET是一个使用HTML.CSS.Javascript来构建动态网站或者网站应用程序的Web框架,并且也可以

ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL

之前介绍了My Blog如何使用ADO.NET来访问SQL Server获取数据.本章将介绍如何使用My SQL来完成数据管理. 在使用My SQL之前需确保开发环境中安装了My SQL数据库和Connector/Net,后者是一个用C#编写的ADO.NET数据提供器,换句话说无论使用SQL Server还是My SQL,ASP.NET都是通过ADO.NET来访问.操作数据库的,它们唯一的区别是数据提供器,所以连接My SQL仍然需要使用System.Data.dll中的类型,以下是之前文章所介

ASP.NET开发实战——(六)ASP.NET MVC &amp; 分层 代码篇

上一篇文章对如何规范使用ASP.NET进行了介绍,本章内容将根据上一篇得出的结论来修改博客应用的代码. 代码分层 综合考虑将博客应用代码分为以下几个层次: ○ 模型:代表应用程序中的数据模型,与数据库表结构对应.同时也作为MVC与逻辑层之间的数据交换对象(后续会使用DTO代替). ○ 仓储:用于管理数据增.删.查.改. ○ 逻辑:用于处理业务逻辑,一般来说是根据应用层提供的数据来驱动业务执行,业务逻辑会使用仓储来对数据持久化. ○ 应用:也就是MVC应用,它为用户提供操作界面(UI),然后调用逻

ASP.NET开发实战——(七)ASP.NET与数据库

在之前的文章中介绍了使用ASP.NET MVC来开发一个博客系统,并且已将初具雏形,可以查看文章列表页面,也可以点击文章列表的其中一篇文章查看详情,这已经完成了最开始需求分析的读者的查看列表和查看文章两个需求,但是现在最大的问题是文章数据仍然是“静态”的. 所有数据被保存在内存中,系统在初始化时会自动添加被硬编码在代码文件中的数据,服务器每次重新启动都只会保留这些数据,并且没有提供“作者”的管理接口,“作者”没法来管理这些数据,哪怕是可以进行管理也没用,因为服务器重启后数据就不存在了,这才是最糟

Web Services 开发实战: 使用 ASP.NET Web API 2(繁体中文视频)

Web Services 開發實戰: 使用 ASP.NET Web API 2 (1) https://channel9.msdn.com/Blogs/Channel9Taiwan/Developing-Web-Services-Using-ASPNET-WebAPI2-Part1 https://channel9.msdn.com/Blogs/Channel9Taiwan/Developing-Web-Services-Using-ASPNET-WebAPI2-Part2 https://ch

Asp.Net 开发实战技术

1.什么是WMI技术 WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程:设定一个在特定日期和时间运行的进程:远程启动计算机:获得本地或远程计算机的已安装程序列表:查询本地或远程计算机的Windows事件日志等等.WMI(Windows管理规范)作为一项Windows管理技术,方便用户对计算机进行远程管理.但是它的易用性也导致了系统的安全性大幅下降. ManagementP

2019java单体应用开发实战项目教程 bootstrap+mvc+spring+idea+maven技术整合

课程介绍:2019Java单体应用包含IDEA,Maven构建应用,三层架构 + MVC,Bootstrap,Spring等技术知识点├─软件├─第01天(14集)│ 005.第01章-使用 Intellij IDEA-第一个 IDEA 应用程序.mp4│ 006.小知识-使用 Markdown 记笔记.mp4│ 007.第02章-使用 Maven 构建应用-Maven 简介.mp4│ 008.第02章-使用 Maven 构建应用-Maven 安装配置.mp4│ 009.第02章-使用 Mave

Android开发学习笔记之四大组件---Activity的介绍,创建以及生命周期

最近重新温习关于android开发的基础知识,还是分享到博客里,一方面分享给有需要的同学,一方面方便自己后期查看 一.什么是Activity 通俗来讲,一屏的界面就是一个Activity,套用比较教科的话,在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应.Activity之间通过Intent进行通信,Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View

MyBatis(四):SqlSession及其工厂类的作用域和生命周期

SqlSession及其工厂类的作用域和生命周期 SqlSession创建流程: 使用SqlSessionFactoryBuilder创建SqlSessionFactory. 使用SqlSessionFactory创建SqlSession. SqlSession可以通过Sql Mapper.class进行数据库操作,或者直接使用SqlSession的方法输入SqlMapper.方法()进行数据库操作,使用完要关闭. SqlSessionFactoryBuilder 就是SqlSessionFac