有一本书叫《asp.net 本质论》,作者名叫冠军。我看了几次,都没有坚持看下来。这次连续看完了前三章,然后参考网上的资料,总结下我对.net运行机制的理解。

先上两张图:

看着这两张图,回顾以前的asp.net的开发经历,很少接触这些东西。现在才知道,一个http请求从发出到响应,asp.net已经帮我们做了大量的工作。而这些幕后工作,正是封装了http请求处理的过程。

我们用的最多的是: Session存个用户信息、Request对象接个参数,Response对象Write,再就是大量的控件,比如Repeat、datalist等等。至于背后的原理,很少关注。

接下来,我们看看从用户请求发出到响应的过程:

1、请求到达监听(IIS Http.sys)

2、找到对应的应用程序池,创建w3wp进程。

3、加载ISAPI

4、加载CLR(IIS7预加载,不需要借助ISAPI)

5、AppManagerAppDomainFactory创建IsAPIRuntime,最终调用ProcessRequest方法,在此方法里,进入HttpRuntime,这是asp.net开始处理的入口。

asp.net 处理流程:

1、HttpRuntime创建HttpContext以及HttpApplication,这是两个及其重要的对象。HttpContext对象中封装了常见的HttpRequestHttpResponse,以及一些状态管理。

2、HttpApplication以管道方式处理,并暴露出了众多的事件,我们可以在一些事件中处理我们的逻辑。

以下摘自《asp.net 本质论》书中,对管道处理的每个阶段描述:

序号

名称

说明

1

BeginRequest

ASP.NET开始处理的第一个事件,表示处理的开始

2

AuthenticateRequest

验证请求,一般用来取得请求的用户信息

3

PostAuthenticateRequest

已经获取请求的用户信息

4

AuthorizeRequest

授权,一般用来检查用户的请求是否获得权限

5

PostAuthorizeRequest

用户请求已经得到授权

6

ResolveRequestCache

获取以前处理缓存的处理结果,如果以前缓存过,那么不必再进行请求的处理工作,直接返回缓存结果

7

PostResolveRequestCache

已经完成缓存的存取工作(在 PostResolveRequestCache 事件之后和 PostMapRequestHandler 事件之前,会创建一个事件处理程序(一个对应于请求 URL 的页)。 如果服务器在集成模式下运行 IIS 7.0 并且 .NET Framework 至少为 3.0 版本,则会引发 MapRequestHandler 事件。 如果服务器在经典模式下运行 IIS 7.0 或者运行的是较早版本的 IIS,则无法处理此事件。)

8

PostMapRequestHandler

已经根据用户的请求,创建了处理请求的处理器对象

9

AcquireRequestState

取得请求的状态,一般用于Session

10

PostAcquireRequestState

已经取得了Session

11

PreRequestHandlerExecute

准备执行处理程序(执行事件处理程序。)

12

PostRequestHandlerExecute

已经执行了处理程序

13

ReleaseRequestState

释放请求的状态

14

PostReleaseRequestState

已经释放了请求的状态(在引发 PostReleaseRequestState 事件之后,现有的所有响应筛选器都将对输出进行筛选。)

15

UpdateRequestCache

更新缓存

16

PostUpdateRequestCache

已经更新了缓存

17

LogRequest.

请求的日志操作(仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。)

18

PostLogRequest

已经完成了请求的日志操作(仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。)

19

EndRequest

本次请求处理完成

3、初始化Module和映射Handler

系统会预先配置一些HttpModule和HttpHandler。我们自己也可以写一些Module和Handler,并注册到系统中。HttpModule特别适合一些通用的功能,统一处理,类似过滤器,HttpHandler针对某一特定请求的处理,如aspx页面请求处理。

4、Handler一般通过工厂获取,比如页面处理,通过PageHandlerFactory来获取

5、asp.net的每一个Page都是一个IHttpHandler。页面是通过模板生成的,至于页面周期呀,控件周期呀,我们现在不用关心它。

我对asp.net运行机制的理解的更多相关文章

  1. ASP.NET运行机制原理

    ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...

  2. ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻

    一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...

  3. WebForm页面生命周期及asp.net运行机制

    1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...

  4. ASP.NET 运行机制

    原本今天打算继续写ASP.NET MVC第四天的.但是由于里面涉及到asp.net运行机制的原理,如果不分析一下这里,mvc想说清楚还是挺困难的.既然要提到asp.net运行机制,所以打算还是说详细一 ...

  5. 了解认识asp.net运行机制

    asp.net  运行机制 下面了解认识httpModule 要创建一个httpModule类 using System;using System.Collections.Generic;using ...

  6. ASP.NET 运行机制详解

    1.浏览器和服务器的交互原理 通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问的电脑上的一个 WEB服务器软件来接收处理, ...

  7. 浏览器UI多线程及JavaScript单线程运行机制的理解

    在上一篇博客中,我对jQuery的队列(queue)机制和动画(animate)机制做了一个深入的解析,在animate的实现机制其核心是依靠queue来完成的,其中在jQuery的链式调用部分,之前 ...

  8. ASP.NET 运行机制续(完结)

    上一篇说到applicationInstance会执行一些列的事件.下面是我在msdn上找到有关asp.net程序生命周期相关的描述及图片 声明周期的起始 ASP.NET 应用程序的生命周期以浏览器向 ...

  9. 初步了解asp.net运行机制

    客户通过客户端浏览器输入url地址请求资源,服务器接收到客户端请求,首先为http请求分配应用程序池,然后在应用程序池中创建请求需要的管道,这个管道对http请求的各个步骤进行了分配. 当用户第一次请 ...

随机推荐

  1. 基于gmap.net制作离线地图下载器

    网上已有大量文章介绍gamp.net和离线下载相关的文章了.我就不在介绍gmap相关的文章了,这里着重介绍一下下载相关原理.其实gmap.net本身已自带下载工能,只是离线图片下载到sqlit中,现将 ...

  2. mysql5.7中解决中文乱码的问题

    在使用mysql5.7时,会发现通过web端向数据库中写入中文后会出现乱码,但是在数据库中直接操作SQL语句插入数据后中文就显示正常,这个问题怎么解决呢?此处不对mysql的数据编码过程和原理进行讲解 ...

  3. Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包

    1,问题详情:Spring使用4.3.5.Release版本后 在SpringMvc配置文件中配置json 解析器后出现报错信息 [org.springframework.web.context.Co ...

  4. QWebSocketServer

    QWebSocketServer 服务端 Public Types Public Function QWebSocketServer(const QString &serverName, Ss ...

  5. Python 关于super 的 用法和原理(挖坑)

    一.前言 Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了.特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸) 二. ...

  6. JavaScript实现排序二叉树的相关算法

    1.创建排序二叉树的构造函数 /** * 创建排序二叉树的构造函数 * @param valArr 排序二叉树中节点的值 * @constructor */ function BinaryTree(v ...

  7. mysql无法启动的结果问题解决

    mac 上homebrew 安装的mysql,已经用了很长时间都没什么问题,今天 ERROR! The server quit without updating PID file (/usr/loca ...

  8. iOS.Animations.by.Tutorials.v2.0汉化(四)

    第三章 转换 在前面的两章,你学习了如何创建基于视图位置和透明度alpha的动画属性的动画.但是,如果您希望在视图上添加动画或删除动画,您将如何处理呢? 您可以使用前几章的方法来设置进出界面的动画效果 ...

  9. linux周期性计划任务 进程管理

    周期性计划任务crontab命令系统服务:/etc/init.d/crond(crond必须启动才会生效)用户计划:/var/spool/cron/用户名默认的计划任务全局配置:/etc/cronta ...

  10. 嵌入式Linux引导过程之1.4——Xloader的ddr_init

    这里我们来看XLOADER_ENTRY中调用的第二个标号ddr_init处的代码,这部分代码的作用是对外部内存SDRAM进行初始化,在我 spearplus开发板中,使用的是DDR SDRAM.在调用 ...