前面的文章我们使用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的功能是用来追踪监测请求数据的。

另外在节点下还有一个节点用于映射请求对应的处理器。

IIS除了加载应用的web.config之外还会通过继承机制“加载”服务器级别的配置文件:

● 服务器级别的Machine.config,该文件位于systemrootMicrosoft .NETFrameworkversionNumberCONFIGMachine.config,它包含了ASP.NET配置节点的默认值。

● 根网站级别的web.config,该文件位于systemrootMicrosoft .NETFrameworkversionNumberConfigweb.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若所思。

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

如何在服务器运行aspx_ASP.NET开发实战——(四)MVC是如何运行?它的生命周期是什么?...相关推荐

  1. .net组件开发系列之武术系列 武术招数 控件生命周期与控件事件机制

    .net组件开发系列之武术系列 武术招数 控件生命周期与控件事件机制一.控件生命周期 先回述上篇,可能表述没有不清晰,也可能跨度大了点,好的,我们来一个循序渐进过程,大家都知道,武术都有招术的,先出什 ...

  2. spark任务shell运行_Spark原理与实战(七)部署模式与运行机制

    导读:Spark的运行模式指的是Spark应用程序以怎样的方式运行,单节本地点运行还是多节点集群运行,自己进行资源调度管理还是依靠别人进行调度管理.Spark提供了多种多样,灵活多变的部署模式. 作者 ...

  3. Android开发笔记(三十九)Activity的生命周期

    与生命周期有关的方法 下面是Activity类与生命周期有关的方法: onCreate : 创建页面 onStart : 开始页面 onStop : 停止页面 onResume : 恢复页面 onPa ...

  4. Android开发艺术探索笔记(一) Activity的生命周期和启动模式(1)

    Activity作为Android开发中最常用的一个组件,是Android开发人员必须熟悉且掌握的重要内容.同时Activity也是在面试中经常被问到的一个方向.因此,掌握Activity的重要性也不 ...

  5. spark任务shell运行_Spark原理与实战之部署模式与运行机制

    前言: Spark的运行模式指的是Spark应用程序以怎样的方式运行,单节本地点运行还是多节点集群运行,自己进行资源调度管理还是依靠别人进行调度管理.Spark提供了多种多样,灵活多变的部署模式. 一 ...

  6. CrazyWing:Python自动化运维开发实战 四、Python变量

    导语: 1.什么是变量 2.变量名称的命名 3.变量赋值 4.变量存储数据的方式 5.引用计数 什么是变量: python学习过程中会用到许多数据,那为了方便操作,需要把这些数据分别用一个简单的名字代 ...

  7. 视频教程-FFmpeg音视频开发实战6 iOS/Android/windows/Linux-其他

    FFmpeg音视频开发实战6 iOS/Android/windows/Linux 先后就职于德国BOSCH,iBabyLabs等企业担任架构设计师,主程, 精通嵌入式Linux,iOS,Android ...

  8. 阿里云-云开发平台入门篇——静态网站的全生命周期实战

    静态网站的全生命周期实战 创建应用 开发部署 下线&删除应用 静态网站的全生命周期实战 云开发平台官网:https://workbench.aliyun.com/ 往期文章: 阿里云开发平台普 ...

  9. 小程序云开发实战步骤教程

    ####前言: 在学习云开发的时候将自己的学习过程记录下来了,放在了网上,收获了一波好评,今天下午在办公室没有事情,也发现之前有人在博客里面评论,你这个教程还有一半哩,可能是csdn的自动搬运功能出来 ...

最新文章

  1. 是时候开始使用JavaScript严格模式了怎样启用javascri
  2. linux对于大文件的解压方法
  3. What is mobile platform?
  4. Bootloader的分区和启动
  5. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(四)
  6. 判断事件源的另一方法
  7. 两个链表生成相加链表
  8. 监控工具—Prometheus—监控Redis
  9. 多所高校内使用AI监控并追踪学生行为惹争议!
  10. zookeeper在Windows底下的安装和使用
  11. 离线安装silver light 2
  12. mysql 权限管理无效_mysql 权限控制笔记
  13. Jquery页面跳转
  14. docker网络配置详解
  15. 完美解决cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘错误
  16. Gym - 102263 B - Road to Arabella
  17. 抛出异常及声明异常 自己定义一个异常
  18. 01_ROS_Introduction
  19. html5的美食街网站论文,难忘的美食文化街优秀作文600字
  20. 国密算法的EKEY的使用

热门文章

  1. php登录后自动退出登录,PHP利用Cookie设置用户30分钟未操作自动退出功能
  2. 红橙Darren视频笔记 手写ButterKnife(Android Studio4.2.2 gradle-6.7.1 )
  3. AIdl server端监听client是否掉线
  4. 根据企业财务进行风险分析——基于pytorch
  5. ubuntu下安装及配置git的方法(最全超详细教程github)
  6. Vue动态类名的实现
  7. docker 运行windows程序_如何从Windows上运行任何Linux图形GUI程序?
  8. jdbctemplate 开启事务_浅入浅出 Spring 事务传播实现原理
  9. flash.net.filereference php,as3与php 上传单个图片demo
  10. 怎么编写java_程序员学编程第一步:手把手教你开发第一个Java程序