前面的文章我们使用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没有魔法——ASP.NET MVC是如何运行的?它的生命周期是什么?的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC 与数据库大集合

    ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...

  2. ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理

    ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...

  3. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  4. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  5. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  6. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  7. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

    对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...

  8. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理

    ASP.NET没有魔法——ASP.NET MVC Razor与View渲染   对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...

  9. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

  10. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

随机推荐

  1. C++ Primmer 学习笔记

    一.开始 (一)输入输出 1.endl的作用 endl操纵符用于结束当前行,将与设备关联的缓冲区内容刷新到设备中.如果没有这个字符,一旦程序突然崩溃,就可能导致输出还停留在缓冲区里,而不显示到设备. ...

  2. 201521123012 《Java程序设计》第三周学习总结

    一.本章学习总结 1.面对对象:(1)类 <1>属性 [1]外部类 [2]内部类 <2>方法 [1]j静态 [2]非静态 (2)对象 <1>创建对象 <2&g ...

  3. 201521123032 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  4. 201521123045 《Java程序设计》 第十三周学习总结

    201521123045 <Java程序设计> 第十三周学习总结 1. 本周学习总结 2. 书面作业 Q1.网络基础 1.1 比较ping www.baidu.com与ping cec.j ...

  5. JVM锁机制之synchronized

    概述: synchronized是java用于处理多线程同步的一个关键字,用于标记一个方法/代码块,使之成为同步方法/同步块. 用synchronized可以避免多线程处理时的竞态条件问题. 相关概念 ...

  6. 国际化:Java平台下的Locale类

    Locale类有如下几个构造器: Locale(String language) Locale(String language, String country) Locale(String langu ...

  7. apriori关联规则

    挖掘数据集:贩物篮数据 频繁模式:频繁地出现在数据集中的模式,例如项集,子结构,子序列等 挖掘目标:频繁模式,频繁项集,关联规则等 关联规则:牛奶=>鸡蛋[支持度=2%,置信度=60%] ...

  8. 使用VMware Workstation Pro 12 虚拟机安装Mac OS系统教程 全程图解

    导读:使用虚拟机安装Windows.Linux或者Ubuntu系统大家或许看了很多,但如何使用VMware Workstation Pro 12安装Mac OS,的确需要好好研究一番:否则无法下手,因 ...

  9. EXIT_SUCCESS EXIT_FAILURE

    在vc++6.0下头文件stdlib.h中定义如下: /* Definition of the argument values for the exit() function */ #define E ...

  10. Paint the Grid Reloaded ZOJ - 3781 图论变形

    Paint the Grid Reloaded Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %ll ...